原始列表在python中被修改

时间:2015-11-13 21:51:33

标签: python

我有一个简单的代码如下:

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列表执行交换功能并再次打印原始列表。结果原始列表被更改。这种行为背后的原因是什么?

2 个答案:

答案 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的浅表副本时,您仍然可以参考l1l2l3。您对这些较小的列表所做的任何更改都将反映在originalList和您制作的任何浅表副本中。您需要深层复制操作。为了您的目的,Scott Hunter回答

temp = [x[:] for x in originalList]

会奏效。在一般情况下,copy模块中的方法deepcopy应该为您提供所需对象的深层副本。在这种情况下使用它仍然可能更好,因为它快几个数量级。