Python 深拷贝、浅拷贝

本文详细解析了Python中is与==的区别,并通过实例展示了浅拷贝与深拷贝的概念及其工作原理。深入探讨了不同类型的拷贝对变量的影响,以及如何使用copy模块进行操作。

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

is 和 == 的区别

从简单的来说, is 比较的是地址,而 == 比较的是地址,下面我们来看一个例子

这里写图片描述
从上面 的例子中我们可以看到 m 和 n 两个列表值是相等的,但是地址不相同,我们看下两个变量的地址
这里写图片描述

但是读者不要忽略了重要的一点,请看下面的这种情况
这里写图片描述

注意,当我们在变量里面保存这种相同的地址的时候,在内存中保存的地址是一样的

读者应该意识当到,这种浅拷贝实际上是两个变量指向同一块地址,当内容发生改变的时候a和b的值都会发生改变

深拷贝 和 浅拷贝

1, 浅拷贝
这里写图片描述

从上图我们知道,当把a值赋值给b的时候,a,b两个变量指向的地址是一样的,也相当于只是拷贝了地址。
这里写图片描述
2, 深拷贝
这里写图片描述
从上面的代码来看,a 和 b的地址是不一样的,说明这是深拷贝,拷贝的不是地址,而是内容,这里需要用到copy这个模块
这里写图片描述

这里当其中一个变化时候不会影响另外的变量

3,扩展一
这里写图片描述

a 和 b分别是两个不同的变量空间,c 存放他们,但是存放的是地址,从上面来看,当a中添加一个元素的时候,c中也会变化,同事d = c也是浅拷贝,仅仅拷贝c的地址

4,扩展二
这里写图片描述

以扩展二为基础,当我在定义一个e,e去深拷贝d,又会是什么样的情况呢,会不会是地址,结果如下
这里写图片描述
当拷贝c的时候会直接深拷贝一份a和b放在e中,跟上面的没有关联了。也就是递归拷贝,当拷贝一个列表,列表中可能存在引用的地址,那么这就会递归的拷贝

5,扩展三 copy 和deepcopy的区别
这里写图片描述

从上面来看,e 是完全被拷贝出来,而d仅仅是拷贝地址,我们可以得出结论,copy是仅仅拷贝第一层,而deepcopy会递归拷贝,一直拷贝到最底层

6,扩展三 深拷贝值拷贝元组
这里写图片描述

大家记住元组是可不可遍历的,copy模块如果拷贝补课遍历的元组会直接全拷贝,如果拷贝可遍历的列表之类的,会拷贝第一层里面的东西

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值