以下是对列表的六种复制方式,总结来说在复制时有三种原理,其中 l 1 l1 l1 是一种, l 6 l6 l6 是第二种,其他的四个方法属于第三种。
import copy
l = [1, 2, [3, 4]]
l1 = l
l2 = l.copy()
l3 = l[:]
l4 = list(l)
l5 = copy.copy(l)
l6 = copy.deepcopy(l)
我们可以先来打印它们的地址:
print(id(l))
print(id(l1))
print(id(l2))
print(id(l3))
print(id(l4))
print(id(l5))
print(id(l6))
2515754890952
2515754890952
2515754891912
2515754910792
2515754891208
2515754863048
2515754910984
由此可以看出, l 1 l1 l1 的复制原理是将 l l l 的地址也一并复制过去了,也就是说,当 l l l 发生改变时, l 1 l1 l1 也会改变。但其他的复制方式则不会发生这个问题,比如:
l[0] = 0
print('l: ', l)
print('l1: ', l1)
print('l2: ', l2)
print('l3: ', l3)
print('l4: ', l4)
print('l5: ', l5)
print('l6: ', l6)
得到:
l: [0, 2, [3, 4]]
l1: [0, 2, [3, 4]]
l2: [1, 2, [3, 4]]
l3: [1, 2, [3, 4]]
l4: [1, 2, [3, 4]]
l5: [1, 2, [3, 4]]
l6: [1, 2, [3, 4]]
但是,如果我们针对 l l l 内部的子列表做出改变时,只有 l 6 l6 l6 会仍然保持不变,如:
import copy
l = [1, 2, [3, 4]]
l1 = l
l2 = l.copy()
l3 = l[:]
l4 = list(l)
l5 = copy.copy(l)
l6 = copy.deepcopy(l)
l[2][0] = 0
print('l: ', l)
print('l1: ', l1)
print('l2: ', l2)
print('l3: ', l3)
print('l4: ', l4)
print('l5: ', l5)
print('l6: ', l6)
l: [1, 2, [0, 4]]
l1: [1, 2, [0, 4]]
l2: [1, 2, [0, 4]]
l3: [1, 2, [0, 4]]
l4: [1, 2, [0, 4]]
l5: [1, 2, [0, 4]]
l6: [1, 2, [3, 4]]
所以,总结来说: