鱼C论坛

 找回密码
 立即注册
查看: 102|回复: 11

浅拷贝和深拷贝

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. >>> x = [1,2,3]
  2. >>> y = x.copy()
  3. >>> x[1] = 1
  4. >>> x
  5. [1, 1, 3]
  6. >>> y
  7. [1, 2, 3]为什么y不变?
  8. >>> x = [1,2,3]
  9. >>> y = x[:]
  10. >>> y
  11. [1, 2, 3]
  12. >>> x[1] = 1
  13. >>> y
  14. [1, 2, 3]
  15. >>> x = [[1,2,3],[4,5,6],[7,8,9]]
  16. >>> y = x.copy()
  17. >>> x[1][1] = 0
  18. >>> x
  19. [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
  20. >>> y
  21. [[1, 2, 3], [4, 0, 6], [7, 8, 9]]为什么y变了?都是浅拷贝,为什么一维的不变,二维的会变?
  22. >>> import copy
  23. >>> x = [[1,2,3],[4,5,6],[7,8,9]]
  24. >>> y = copy.copy(x)
  25. >>> x[1][1] = 0
  26. >>> x
  27. [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
  28. >>> y
  29. [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
  30. >>> x = [[1,2,3],[4,5,6],[7,8,9]]
  31. >>> y = copy.deepcopy(x)
  32. >>> x[1][1] = 0
  33. >>> x
  34. [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
  35. >>> y
  36. [[1, 2, 3], [4, 5, 6], [7, 8, 9]]为什么y又不变了?
  37. >>>
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
关于浅拷贝和深拷贝的区别,我来用通俗易懂的方式解释:

### 一维列表的例子(y不变的原因)

  1. >>> x = [1, 2, 3]
  2. >>> y = x.copy()  # 浅拷贝:创建新列表,复制元素引用
  3. >>> x[0] = 100   # 修改x的第一个元素
  4. >>> x
  5. [100, 2, 3]
  6. >>> y
  7. [1, 2, 3]       # y不变
复制代码

原因:
1. 浅拷贝创建了新列表y,但元素仍是原对象的引用
2. 整数1是不可变对象,x[0] = 100实际是让x[0]指向新对象
3. y[0]仍然指向原来的整数1

### 二维列表的例子(y变化的原因)

  1. >>> x = [[1,2], [3,4]]
  2. >>> y = x.copy()  # 浅拷贝:只复制最外层
  3. >>> x[0][0] = 100 # 修改内层元素
  4. >>> x
  5. [[100, 2], [3, 4]]
  6. >>> y
  7. [[100, 2], [3, 4]]  # y跟着变化
复制代码

原因:
1. 浅拷贝只创建了外层新列表
2. 内层的子列表[1,2][3,4]仍是同一个对象
3. 修改子列表内容时,所有引用该子列表的变量都会看到变化

### 深拷贝的例子(y不变的原因)

  1. >>> import copy
  2. >>> x = [[1,2], [3,4]]
  3. >>> y = copy.deepcopy(x)  # 深拷贝:递归复制所有层级
  4. >>> x[0][0] = 100
  5. >>> x
  6. [[100, 2], [3, 4]]
  7. >>> y
  8. [[1, 2], [3, 4]]  # y不受影响
复制代码

原因:
1. 深拷贝会递归复制所有嵌套对象
2. 创建了全新的子列表[1,2][3,4]
3. x和y的内层对象完全独立

### 总结表格
操作类型复制深度嵌套对象影响
直接赋值 (y = x)零复制完全同步变化
浅拷贝 (y = x.copy())仅最外层嵌套对象会同步变化
深拷贝 (copy.deepcopy())所有层级完全独立


关键点:
o 浅拷贝:适合单层不可变对象(如整数、字符串)
o 深拷贝:必需用于多层可变对象(如嵌套列表、字典)
o 修改外层:浅拷贝的新对象不受影响
o 修改内层:浅拷贝的新对象会受影响

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
还是没有完全理解,是不是我理解能力有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
我还是不明白,为什么浅拷贝和深拷贝应用到一维和二维都会有区别?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
为什么一维列表修改元素y不变,二维列表修改元素y确变了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
mulinyurui 发表于 2025-7-27 21:44
为什么一维列表修改元素y不变,二维列表修改元素y确变了?

因为是浅拷贝,只拷贝了外面的,所以里面会变,
不需要怎么理解,只要知道浅拷贝和深拷贝的区别和作用就行了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
pyzyd 发表于 2025-7-27 21:55
因为是浅拷贝,只拷贝了外面的,所以里面会变,
不需要怎么理解,只要知道浅拷贝和深拷贝的区别和作用就 ...

一维列表没有里面吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
mulinyurui 发表于 2025-7-27 22:03
一维列表没有里面吗?

。。。
我的意思是只拷贝了一层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 4 天前 | 显示全部楼层
本帖最后由 小甲鱼的二师兄 于 2025-7-27 22:56 编辑

浅拷贝:只复制最外层,里面的对象还是同一个。

  1. import copy

  2. a = [1, 2, [3, 4]]
  3. b = copy.copy(a)  # 或者 b = a[:]

  4. b[0] = 100
  5. print(a)  # [1, 2, [3, 4]]
  6. print(b)  # [100, 2, [3, 4]]

  7. b[2][0] = 300
  8. print(a)  # [1, 2, [300, 4]]
  9. print(b)  # [100, 2, [300, 4]]
复制代码


深拷贝:所有层都复制,完全独立。

  1. import copy

  2. a = [1, 2, [3, 4]]
  3. b = copy.deepcopy(a)

  4. b[0] = 100
  5. print(a)  # [1, 2, [3, 4]]
  6. print(b)  # [100, 2, [3, 4]]

  7. b[2][0] = 300
  8. print(a)  # [1, 2, [3, 4]]
  9. print(b)  # [1, 2, [300, 4]]
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
本帖最后由 小甲鱼的二师兄 于 2025-7-27 22:58 编辑

仔细对比一下上面的例子,应该可以快速的了解它们的区别。

其实只需要记住,对于超过一维的复杂对象,就要使用深拷贝。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
你猜这深浅指什么
一维是浅,多维是深
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
对于超过一维的复杂对象,就要使用深拷贝。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-31 10:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表