原始列表在 python 中被修改

use*_*893 3 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
Run Code Online (Sandbox Code Playgroud)

最初,我使用上面显示的值定义一个列表,然后将此列表复制到临时列表。两种复制方法我都试过了。然后我使用列表执行交换功能temp并再次打印原始列表。结果,原来的列表发生了变化。这种行为背后的原因是什么?

Bri*_*ien 5

复制列表的方式(双向)称为浅复制。可以这样更好地看出这一点:

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]]
Run Code Online (Sandbox Code Playgroud)

当您制作 的浅表副本时originalList,您仍然会引用l1, l2, 和l3。您对这些较小列表所做的任何更改都将反映在originalList您所做的任何浅副本中。您想要进行深复制操作。为了您的目的,斯科特·亨特的回答是

temp = [x[:] for x in originalList]
Run Code Online (Sandbox Code Playgroud)

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