鱼C论坛

 找回密码
 立即注册
查看: 1435|回复: 2

新人每日一问,Python拷贝与赋值的列表元素的变化

[复制链接]
发表于 2022-3-3 21:06:26 | 显示全部楼层 |阅读模式

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

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

x
列表拷贝和赋值有个问题,请各位大佬指点一二,谢谢:

list1 = [1,2,3,4,5,6,7]
list2 = list1
list3 = list1.copy()
del list1[5]
print(list2)
print(list3)
输出结果
[1, 2, 3, 4, 5, 7]
[1, 2, 3, 4, 5, 6, 7]

由此我推出结论如下:

#使用=赋值,若源列表的元素变化时,赋值后的内容会跟随变化
# 浅拷贝copy拷贝完后,若源列表的元素变化时,拷贝后的内容不变

同样看个实例:
arr = [{'name': 'wcl', 'age': 23}, {'name': 'wjy', 'age': 14}]
arr2 = arr.copy()
del arr[1]
arr[0]['age'] = 18  #或者arr2[0]['age'] = 18
print('arr', arr)
print('arr2', arr2)

输出的结果为:
arr [{'name': 'wcl', 'age': 18}]
arr2 [{'name': 'wcl', 'age': 18}, {'name': 'wjy', 'age': 14}]


问题:为什么此处拷贝后的arr2的元素内容跟随源列表arr替换元素后却变化了?

难道我的推论不成立吗?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-3 21:27:20 | 显示全部楼层
因为直接赋值,是直接指向原列表的地址,所以这两个列表是同一个,

而 copy 是浅拷贝,只是将列表里面的所有元素拷贝到一个新的列表,它们只是最外层列表的地址不相同了,

但是列表里面的元素还是跟原来的列表里面的元素是同一个,

而深拷贝会把列表里面的元素也重新赋值一份,

你可以通过下面的代码的执行结果看一下区别:
import copy
list1 = [[1, 2, 3]]
list2 = list1             # 直接赋值
list3 = list1.copy()             # 浅拷贝
list4 = copy.deepcopy(list1)     # 深拷贝
print(f'list2 is list1: {list2 is list1}')
print(f'list3 is list1: {list3 is list1}')
print(f'list4 is list1: {list4 is list1}')
for i in range(len(list1)):
    print(f'list2[{i}] is list1[{i}]: {list2[i] is list1[i]}')
    print(f'list3[{i}] is list1[{i}]: {list3[i] is list1[i]}')
    print(f'list4[{i}] is list1[{i}]: {list4[i] is list1[i]}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-4 08:50:51 | 显示全部楼层
用 deepcopy ,浅拷贝只能在拷贝一维列表时不受影响,更高维度的请使用 deepcopy!具体使用方法及讲解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 12:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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