1、引子
l1 = [1, 2, 3]
l2 = l1
l1.append('a')
print(l2)
可变数据类型,赋值复制后,更改其中一个,另一个将会发生改变。
为解决这一问题,需要对数据执行深浅copy
2、浅copy
l1 = [1, 2, 3] l2 = l1.copy() l1.append('a') print(l1) print(l2)
使用copy方法,实现了列表的复制,但是对孙子辈,重孙辈无效
# copy方法可以保证第一层的数据添加后不变 # 但是第二层数据添加,同样影响到copy后的列表 l1 = [1, 2, [4, 5, 6], 3] l2 = l1.copy() l1.append('a') print(id(l1), id(l2)) print(l1, l2) l1[2].append('第二层') print(id(l1), id(l2)) print(l1, l2) # [1, 2, [4, 5, 6, '第二层'], 3, 'a'] [1, 2, [4, 5, 6, '第二层'], 3] print(id(l1[2]), id(l2[2])) # 3015533617800 3015533617800
从以上命令,可以看出,第二层依然指向相同的内存
3、深copy
import copy l1 = [1, 2, [4, 5, 6,[12,3,4]], 3] l2 = copy.deepcopy(l1) print("第一层添加值") l1.append('a') print(id(l1), id(l2)) print(l1, l2) print('第二层添加值') l1[2].append('第二层') print(id(l1), id(l2)) print(l1, l2) # [1, 2, [4, 5, 6, [12, 3, 4], '第二层'], 3, 'a'] [1, 2, [4, 5, 6, [12, 3, 4]], 3] print(id(l1[2]), id(l2[2])) # 3015535702088 3015535594056 l1[2][3].append('第三层') print(id(l1[2][3]), id(l2[2][3])) # 3015535842120 3015535842440 print(l1,l2) # [1, 2, [4, 5, 6, [12, 3, 4, '第三层'], '第二层'], 3, 'a'] [1, 2, [4, 5, 6, [12, 3, 4]], 3]
深copy后,列表所有的层级都分配独立的内存,不在共享