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模块如果拷贝补课遍历的元组会直接全拷贝,如果拷贝可遍历的列表之类的,会拷贝第一层里面的东西
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)