鱼C论坛

 找回密码
 立即注册
查看: 2455|回复: 5

[已解决]关于用分片法以及copy()拷贝列表的问题

[复制链接]
发表于 2017-7-31 11:00:58 | 显示全部楼层 |阅读模式

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

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

x
如图片所示,小甲鱼在课上讲的时候,说使用分片法或copy()语句是实打实的将一个列表再拷贝一份,其中的内容,不会随着原列表的改变而改变,但为何我在将原列表(list1)中的['小甲鱼']改变成['小魔鱼']时,新列表(list2,list3)中也发生了改变?希望懂的答案的同学们能够给予解答一下,谢谢大家~
最佳答案
2017-7-31 11:11:00
这里涉及到浅拷贝和深拷贝的问题。
简单的说,浅拷贝只是列表的第一层复制到新地址,而第二层或更深的嵌套列表的元素仍是老地址,所以会跟着改变。
如果想做出完全不受影响的复制操作,可以使用深拷贝。
参见下面的例子:
  1. >>> import copy
  2. >>> list1 = [1, 2, [3 ,4], 5]
  3. >>> list2 = list1.copy() #浅拷贝
  4. >>> list1[0]=-1
  5. >>> list1
  6. [-1, 2, [3, 4], 5]
  7. >>> list2
  8. [1, 2, [3, 4], 5]#第一层的元素不改变
  9. >>> list1[2][0] = -1
  10. >>> list1
  11. [-1, 2, [-1, 4], 5]
  12. >>> list2
  13. [1, 2, [-1, 4], 5]#第二层的元素还是改变了
  14. >>> list3 = copy.deepcopy(list1) #深拷贝
  15. >>> list1[0] = 'A'
  16. >>> list1
  17. ['A', 2, [-1, 4], 5]
  18. >>> list3
  19. [-1, 2, [-1, 4], 5]#第一层没变
  20. >>> list1[2][0] = 'B'
  21. >>> list1
  22. ['A', 2, ['B', 4], 5]

  23. >>> list3
  24. [-1, 2, [-1, 4], 5]#第二层仍然没变
复制代码

问题

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

使用道具 举报

 楼主| 发表于 2017-7-31 11:02:50 | 显示全部楼层
不好意思,应该是由['小鱿鱼']变成['小魔鱼']时,上面描述有点错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-31 11:11:00 | 显示全部楼层    本楼为最佳答案   
这里涉及到浅拷贝和深拷贝的问题。
简单的说,浅拷贝只是列表的第一层复制到新地址,而第二层或更深的嵌套列表的元素仍是老地址,所以会跟着改变。
如果想做出完全不受影响的复制操作,可以使用深拷贝。
参见下面的例子:
  1. >>> import copy
  2. >>> list1 = [1, 2, [3 ,4], 5]
  3. >>> list2 = list1.copy() #浅拷贝
  4. >>> list1[0]=-1
  5. >>> list1
  6. [-1, 2, [3, 4], 5]
  7. >>> list2
  8. [1, 2, [3, 4], 5]#第一层的元素不改变
  9. >>> list1[2][0] = -1
  10. >>> list1
  11. [-1, 2, [-1, 4], 5]
  12. >>> list2
  13. [1, 2, [-1, 4], 5]#第二层的元素还是改变了
  14. >>> list3 = copy.deepcopy(list1) #深拷贝
  15. >>> list1[0] = 'A'
  16. >>> list1
  17. ['A', 2, [-1, 4], 5]
  18. >>> list3
  19. [-1, 2, [-1, 4], 5]#第一层没变
  20. >>> list1[2][0] = 'B'
  21. >>> list1
  22. ['A', 2, ['B', 4], 5]

  23. >>> list3
  24. [-1, 2, [-1, 4], 5]#第二层仍然没变
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-31 11:31:12 | 显示全部楼层
支持一下,新手自学,真正的零基础,我也是疑问重重
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-31 17:18:16 | 显示全部楼层
冬雪雪冬 发表于 2017-7-31 11:11
这里涉及到浅拷贝和深拷贝的问题。
简单的说,浅拷贝只是列表的第一层复制到新地址,而第二层或更深的嵌套 ...

明白了!非常感谢您的回复~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-31 17:40:16 | 显示全部楼层
3楼哥们儿正解,给人个答案最佳啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 04:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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