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后,列表所有的层级都分配独立的内存,不在共享

01-26 06:42