python中复制列表的三种方法详解

如果在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。

猜你喜欢

转载自blog.csdn.net/weixin_43793472/article/details/88380897