如果在python中需要复制一个列表,通常有三种方法,第一种使用“=”符号,第二种使用方法.copy(),第三种是标准库中copy模块的deepcopy,下面将详解三种方法的区别。
如果不包含子列表
测试代码如下:
from copy import deepcopy
a = [1, 2]
b = a
c = a.copy()
d = deepcopy(a)
a[0] = 3
print('原列表: ', a)
print('使用=: ', b)
print('使用.copy(): ', c)
print('使用deepcopy: ', d)
输出:
原列表: [3, 2]
使用=: [3, 2]
使用.copy(): [1, 2]
使用deepcopy: [1, 2]
在列表中不存在子列表的情况下,.copy()和deepcopy都实现了对列表的深复制,而使用"="只是实现了对列表的引用,如果原列表改变,复制的列表也会相应改变。
如果包含子列表
首先尝试修改非子列表的元素,测试代码如下:
from copy import deepcopy
a = [1, [2, 3]]
b = a
c = a.copy()
d = deepcopy(a)
a[0] = 4
print('原列表: ', a)
print('使用=: ', b)
print('使用.copy(): ', c)
print('使用deepcopy: ', d)
输出:
原列表: [4, [2, 3]]
使用=: [4, [2, 3]]
使用.copy(): [1, [2, 3]]
使用deepcopy: [1, [2, 3]]
可见,修改非子列表的元素和不包含子列表时情况是一样的。
尝试修改一下子列表的元素:
from copy import deepcopy
a = [1, [2, 3]]
b = a
c = a.copy()
d = deepcopy(a)
a[1][0] = 4
print('原列表: ', a)
print('使用=: ', b)
print('使用.copy(): ', c)
print('使用deepcopy: ', d)
输出:
原列表: [1, [4, 3]]
使用=: [1, [4, 3]]
使用.copy(): [1, [4, 3]]
使用deepcopy: [1, [2, 3]]
此时体现了使用deepcopy的重要性,只有使用deepcopy才能保证复制的列表不受影响。
反过来思考
使用"="复制的列表修改后会不会影响原列表呢?
a = [1, 2]
b = a
b[0] = 3
print(a)
输出:
[3, 2]
答案是会的。
总结
- 如果想对列表进行引用(修改会影响其他列表),则使用=
- 如果列表中不含有子列表,则可以直接用方法.copy()
- 如果列表中有子列表,则使用deepcopy
如果无法确保列表在未来会含有子列表,建议直接使用deepcopy。