在python中的函数中使用列表

时间:2017-01-07 11:11:16

标签: python python-2.7

我无法理解下面代码中发生的事情

#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]]

1 个答案:

答案 0 :(得分:3)

原因是

alpha = W[:]    # and also beta=X[:]

仅创建列表的浅层副本。这意味着实际上只复制外部列表。然后,此外部列表再次包含对更多列表的引用 - 这些列表未被复制(仅对它们的引用)。

因此,您的副本alphabeta始终引用相同的嵌套列表,并交换这些列表中的元素。这就是为什么你可以在调用

后看到交换发生两次的原因
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]]