fengjianyx 发表于 2022-3-3 21:06:26

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

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

list1 =
list2 = list1
list3 = list1.copy()
del list1
print(list2)
print(list3)
输出结果



由此我推出结论如下:

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

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

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


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

难道我的推论不成立吗?

isdkz 发表于 2022-3-3 21:27:20

因为直接赋值,是直接指向原列表的地址,所以这两个列表是同一个,

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

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

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

你可以通过下面的代码的执行结果看一下区别:
import copy
list1 = []
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 is list1}')
    print(f'list3[{i}] is list1[{i}]: {list3 is list1}')
    print(f'list4[{i}] is list1[{i}]: {list4 is list1}')

python爱好者. 发表于 2022-3-4 08:50:51

用 deepcopy ,浅拷贝只能在拷贝一维列表时不受影响,更高维度的请使用 deepcopy!具体使用方法及讲解
页: [1]
查看完整版本: 新人每日一问,Python拷贝与赋值的列表元素的变化