Python基础 ‘ 深拷贝 浅拷贝原理深度解析篇

本文深入解析Python中的is与==的区别,以及深拷贝和浅拷贝的概念。通过实例解释赋值、浅拷贝和深拷贝在内存管理和对象引用上的差异,帮助理解Python中的数据复制机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录    

         Python 零基础到入门数据类型篇

         Python基础 字符串常用方法篇

         Python基础 列表常用方法篇

         Python基础 字典常用方法篇        

         Python基础 ' 深拷贝 浅拷贝原理深度解析篇


文章目录


前言

     今天主要跟大家讲一下 关于is == 符号的使用 与深拷贝、浅拷贝原理深度解析


一、is 与 ==比的是什么?其中 ==符号比较的是两个变量的值,而is 是比较两个变量引用的地址是否一致,我们看图:

i1 = 1
i2 = 1

print(i1==i2)
True

print(id(i2))
140703233152784

print(id(i1))
140703233152784

通过图片我们可知,两个值是相等的,两个值的id也是相同的,什么是id呢?就是这个变量的身份标识,内存空间的引用地址。这里我们要注意,由于python提前为一些数值做了缓存,就是引用这些变量不会开辟新的内存地址,而是使用原有的。所以会看到用数值两个变量 的值与id都是相等的,但是如果我们换成其他类型那就不一样了,我们再用其他类型举个例子

a = [1,2,3]
b = [1,2,3]

print(True)

print(id(a))
1378649455360

print(id(b))
1378649455360

print(a is b)
False

通过图片可知其内 容依然是相等但是 id变了,就是引用的地址不一样了。

二、赋值、深拷贝、浅拷贝的区别

(1)什么是赋值呢?举个简单的例子,我和我老婆家里一共有10块钱,我和我老婆都可以去这个钱包里拿钱或者存钱,这就是赋值。[258,123]列表就是我们家的钱包,i1 和i2 分别代表我和我老婆

代码如下:

i1 = 258
i2 = i1

print(i1==i2)
True

print(i1 is(i2))
True

print(id(i2))
140703233152784

print(id(i1))
140703233152784

(2)什么是浅拷贝呢?我们家里除了10块钱,我自己还偷偷藏了5块钱小金库,家里的10块钱的存钱与取钱逻辑不变,但是我自己小金库的增加和减少只取决于我自己 。这里的子列表['small_money']就是我的小金库

i1 = [258,123,['small_money']]
i2 = list(i1)

print(i1==i2)
True

print(i1 is(i2))
False

print(id(i2))
2528091307392

print(id(i1))
2528090936576

 要想创造小金库有几种方法:

# 通过对象本身的构造器
i1 = [258,123,['small_money']]
i2 = list(i1)
print(i1==i2)
True

print(i1 is(i2))
False

print(id(i2))
1859946871872

print(id(i1))
1859946501376


# 通过切片实现浅拷贝
l1 =[1,2,3]
l2 =l1[:]
print(l1==l2)
True

print(l1 is(l2))
False

print(id(l2))
1859946862912

print(id(l1))
1859946863360


# 通过copy方法实现浅拷贝

l1 =[4,5,6]
l2 =l1.copy()
print(l1==l2)
True

print(l1 is(l2))
False

print(id(l2))
1859946863360

print(id(l1))
1859946870592

(3) 什么是浅拷贝呢?什么是深拷贝呢?老婆发现了我的小金库,一气之下把家里的15元巨资 变成2份,没人7.5元 各自花各自的

import copy

i1 = [258,123,['small_money']]
i2 = copy.deepcopy(i1)
print(i1==i2)
True

print(i1 is(i2))
False

print(id(i2))
1236758756864
 

总结

提示:这里对文章进行总结:

以上就是今天要讲的内容,本文深入全面的介绍了深拷贝与浅拷贝使用,对今天的内容做一个专业的总结

1:is对比的是id是否一致,我们可以通过 id(变量名)来查看变量的id

2:   ==对比的两个变量的是否一致

3:赋值是两个变量指向同一块引用

4:浅拷贝是重新分配一块内存,创建一个新的对象,里面的元素是元对象中子对象的引用,白话文就是外层是新对象,增删改不受影响,嵌套里的内容引用是同一个

5:深拷贝是一个东西 赋值两份,彼此独立互不影响

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安洪旭真好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值