我有一个简单的代码如下:
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并再次打印原始列表。结果,原来的列表发生了变化。这种行为背后的原因是什么?
复制列表的方式(双向)称为浅复制。可以这样更好地看出这一点:
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应该为您提供所需对象的深层副本。在这种情况下使用它仍然可能更好,因为它的速度快了几个数量级。