Python 深拷贝、浅拷贝

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模块如果拷贝补课遍历的元组会直接全拷贝,如果拷贝可遍历的列表之类的,会拷贝第一层里面的东西

posted @   飞航之梦  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示