深浅拷贝异同
| 相同点: |
| |
| 无论深拷贝还是浅拷贝都会创建一个新对象。即:拷贝出来的对象的id不同。 |
| |
| 不同点: |
| |
| 浅拷贝:只拷贝了对象,对象内的元素并不会发生拷贝。 |
| 深拷贝:不仅拷贝对象,对象内的元素也会发生拷贝。 |
浅拷贝
浅拷贝举例
来看一个浅拷贝的例子:
| import copy |
| a = [1, 2, [3, 4]] |
| b = copy.copy(a) |
| print(id(a)) |
| print(id(b)) |
| |
| print(id(a[2])) |
| print(id(b[2])) |
代码解释:
| 1)b通过浅拷贝a之后,a和b对象的id不同(与相同点吻合) |
| 2)分别取a和b的第3个元素的id(第3个元素是可变对象),发现a和b的第3个元素的id值相同。说明并没有拷贝元素的id,也就是说a和b内部的元素id都是相同的。(与浅拷贝的不同点吻合) |
浅拷贝修改元素值
| 上面说到了对象a和b内部的元素id都是相同的,那就意味着a、b对象内部的元素是同一个东西。 |
| ★重点★:但是并不代表浅拷贝下修改了a内元素元素的值,b元素内元素的值一定会发生变化,还要看被修改的值是否是可变对象: |
| |
| 【情况一】:如果是修改的元素是可变对象,那么修改了a内元素,b内元素会发生变化,该元素的在a、b内的id不会发生变化; |
| 【情况二】:如果修改的元素是不可变对象,那么修改了a内元素,b内元素不会发生变化,该元素在a、b内的id会发生变化 |
| |
| import copy |
| a = [1, 2, [3, 4]] |
| b = copy.copy(a) |
| |
| a[2][1] = 4 |
| print(a) |
| print(b) |
| print(id(a[2])) |
| print(id(b[2])) |
情况1代码解释:
| a的元素[3, 4]是可变对象,所以修改了a元素,b元素也会同步修改,但是由于是浅拷贝,a、b内元素的id并不会发生变化。 |
| |
| import copy |
| a = [1, 2, [3, 4]] |
| b = copy.copy(a) |
| |
| a[1] = 4 |
| print(a) |
| print(b) |
| print(id(a[1])) |
| print(id(b[1])) |
情况2代码解释:
| a元素的第一个元素是数值型(int类型),是不可变对象,所以修改了a元素,b并不会发生变化,a与b在第一个位置上的元素就属于两个不同的东西了,自然a、b的id就不相等。 |
深拷贝
深拷贝举例
| import copy |
| |
| a = [1, 2, [3, 4]] |
| b = copy.deepcopy(a) |
| |
| print(id(a)) |
| print(id(b)) |
| |
| print(id(a[2])) |
| print(id(b[2])) |
代码解释:
| 1)b通过浅拷贝a之后,a和b对象的id不同(与2.1中相同点吻合) |
| 2)分别取a和b的第3个元素的id(第3个元素是可变对象),发现a和b的第3个元素的id值不相同。说明a拷贝了元素b,也就是说a和b内部的元素id都是不同的个体。(与深拷贝的不同点吻合) |
深拷贝修改值
| 与浅拷贝相反,可以将深拷贝也分为两种情况: |
| 【情况一】:如果是修改的元素是可变对象,那么修改了a内元素,b内元素不会发生变化,该元素的在a、b内的id会发生变化; |
| 【情况二】:如果修改的元素是不可变对象,那么修改了a内元素,b内元素不会发生变化,该元素在a、b内的id会发生变化(与浅拷贝相同) |
| |
| import copy |
| a = [1, 2, [3, 4]] |
| b = copy.deepcopy(a) |
| |
| a[2][0] = 4 |
| print(a) |
| print(b) |
| print(id(a[2])) |
| print(id(b[2])) |
情况1代码解释:
| a的元素[3, 4]是可变对象,是深拷贝,所以修改了a元素,b元素并不会同步修改。由于是深拷贝,修改a内可变对象元素,b内元素的id并不会发生变化。 |
总结
| 浅拷贝 : |
| 对象1 ——>通过copy.copy()生成——> 对象2 |
| 修改了对象 1 ----> 对象1发生变化 ----> 复制出来的对象 2 也会随着对象1改变而改变 |
| 复制一份原来的对象,如果原来的对象中存在可变数据类型, |
| 修改原来的可变数据类型,原来的数据肯定会变,通过浅拷贝出来的对象中的内容也会随着改变 |
| |
| 深拷贝 : |
| 对象1 ——>通过copy.deepcopy()生成——> 对象2 |
| 修改了对象 1 ----> 对象1发生变化 ----> 复制出来的对象 2 不会改变 |
| 复制一份原来的对象,如果原来的对象中存在可变数据类型, |
| 修改原来的可变数据类型,原来的数据肯定会变,我深拷贝出来的对象中的内容不会改变 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具