正如 Martijn Pieters 所说, each[:] 将通过创建每个嵌套列表的浅表副本来执行。如果您的列表元素是不可变对象,那么您可以使用它,否则您必须使用复制模块中的 deepcopy。
可以使用切片运算符完全复制浅表结构而不会产生任何副作用,请查看以下快照:
LIST_1 = ['A','B',['AB','BA']]
print LIST_1
>>> ['A', 'B', ['AB', 'BA']]
LIST_2= LIST_1[:]
print id(LIST_1)
>>> 40427648
print id(LIST_2)
>>> 50932872
LIST_2[2][1] = "D"
LIST_2[2][0] = "C";
print LIST_2
>>> ['A', 'B', ['C', 'D']]
print LIST_1
>>> ['A', 'B', ['C', 'D']]
但是在 deepcopy 方法中:
解决上述问题的方法是使用“复制”模块。这个模块提供了方法“copy”,它允许一个任意列表的完整副本,即浅表和其他列表。所以你使用copy.deepcopy(...) 来深度复制一个列表:
deepcopy(x, memo=None, _nil=[])
下面的脚本使用我们上面的例子和这个方法:
from copy import deepcopy
LIST_1 = ['A','B',['AB','BA']]
LIST_2= deepcopy(LIST_1)
LIST_2[2][1] = "D"
LIST_2[0] = "C";
print LIST_2
>>>['C', 'B', ['AB', 'D']]
print LIST_1
>>>['A', 'B', ['AB', 'BA']]
因此,每个嵌套列表的浅表副本不会递归地复制内部对象。它只复制最外面的列表,同时仍然从前一个变量引用内部列表,这就是 deepcopy 速度较慢的原因。