python 复制列表的六种方法

以下是对列表的六种复制方式,总结来说在复制时有三种原理,其中 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]]

所以,总结来说:

  • l 1 = l l1 = l l1=l:当 l l l 变化时, l 1 l1 l1 也会变化。
  • l 2 = l . c o p y ( ) l2 = l.copy() l2=l.copy() l 3 = l [ : ] l3 = l[:] l3=l[:] l 4 = l i s t ( l ) l4 = list(l) l4=list(l) l 5 = c o p y . c o p y ( l ) l5 = copy.copy(l) l5=copy.copy(l):当 l l l 中的单个数字发生变化时, l 2 l2 l2 l 3 l3 l3 l 4 l4 l4 l 5 l5 l5 都不会改变;当 l l l 中的子列表发生变化时, l 2 l2 l2 l 3 l3 l3 l 4 l4 l4 l 5 l5 l5 都会改变。
  • l 6 = c o p y . d e e p c o p y ( l ) l6 = copy.deepcopy(l) l6=copy.deepcopy(l):无论 l l l 怎么变化, l 6 l6 l6 都不会变。

你可能感兴趣的:(python)