我有一个简单的代码如下:
def swap(node):
m00 = node[0][0]
node[0][0] = node[1][0]
node[0][1] = m00
originalList = [[1,2,3], [4,5,6], [7,8,9]]
# temp = list(originalList)
temp = originalList[:]
swap(temp)
print originalList
最初,我使用上面显示的值定义列表,然后将此列表复制到临时列表中。我尝试了两种复制方法。然后我使用temp
列表执行交换功能并再次打印原始列表。结果原始列表被更改。这种行为背后的原因是什么?
答案 0 :(得分:3)
originalList[:]
制作外部列表的副本,但是3个较短的列表。你可以像这样复制它们:
temp = [x[:] for x in originalList]
答案 1 :(得分:3)
复制列表的方式(两种方式)称为浅层复制。这可以通过这种方式更好地看到:
l1 = [1,2,3]
l2 = [4,5,6]
l3 = [7,8,9]
originalList = [l1,l2,l3]
temp = originalList[:]
l1[0] = 0
>>> temp
[[0, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> originalList
[[0, 2, 3], [4, 5, 6], [7, 8, 9]]
当您制作originalList
的浅表副本时,您仍然可以参考l1
,l2
和l3
。您对这些较小的列表所做的任何更改都将反映在originalList
和您制作的任何浅表副本中。您需要深层复制操作。为了您的目的,Scott Hunter回答
temp = [x[:] for x in originalList]
会奏效。在一般情况下,copy
模块中的方法deepcopy
应该为您提供所需对象的深层副本。在这种情况下使用它仍然可能更好,因为它快几个数量级。