我无法理解下面代码中发生的事情
#swaps list in index 1
L=[[1,2],[3,4]]
def swap(X):
beta=X[:]
beta[1][0],beta[1][1]=beta[1][1],beta[1][0]
return beta
def code(W):
alpha=W[:]
print swap(alpha)
return swap(alpha)
print code(L)
它提供输出
[[1, 2], [4, 3]]
[[1, 2], [3, 4]]
虽然我期待
[[1, 2], [4, 3]]
[[1, 2], [4, 3]]
答案 0 :(得分:3)
原因是
alpha = W[:] # and also beta=X[:]
仅创建列表的浅层副本。这意味着实际上只复制外部列表。然后,此外部列表再次包含对更多列表的引用 - 这些列表未被复制(仅对它们的引用)。
因此,您的副本alpha
和beta
始终引用相同的嵌套列表,并交换这些列表中的元素。这就是为什么你可以在调用
swap(alpha)
两次。
如果要制作深层副本,可以使用copy
模块并编写
alpha = copy.deepcopy(W) # instead of alpha = W[:]
和
beta= copy.deepcopy(X) # instead of beta = X[:]
执行此操作将为您提供预期的输出:
[[1, 2], [4, 3]]
[[1, 2], [4, 3]]