Python列表不必要地更新附加列表

时间:2014-12-27 07:28:00

标签: python stack

我需要使用一个堆栈来推送和弹出包含2个数字的列表,这些列表在我正在编写的程序中用作XY坐标。这看起来很简单,所以我只是做了

stack = []

使列表我将用作堆栈。现在我创建坐标变量

coord = [0,0]

并将其推入堆栈。

stack.append(coord)

现在,堆栈等于

[[0, 0]]

那是完美的。现在让我们说我向上移动一个,所以我的坐标变量Y值更新如

coord[1] += 1

和coord等于

[0,1]

这很好。可是等等!即使我没有对堆栈列表做任何事情,它现在读取

[[0,1]]

当我希望它保留我发送给它的旧价值时。

[[0,0]]

为什么会发生这种情况,我该怎样做才能实现我想要的目标?

万一它不清楚,我希望堆栈的行为像

>>> stack = []
>>> stack
[]

>>> coord = [0,0]
>>> stack.append(coord)
>>> stack
[[0, 0]]

>>> coord[1] += 1
>>> stack
[[0, 0]]

>>> stack.append(coord)
>>> stack
[[0, 0], [0, 1]]

但这就是它的作用。

>>> stack = []
>>> stack
[]

>>> coord = [0,0]
>>> stack.append(coord)
>>> stack
[[0, 0]]

>>> coord[1] += 1
>>> stack
[[0, 1]]

>>> stack.append(coord)
>>> stack
[[0, 1], [0, 1]]

coords[1] += 1更改为coords[1] = coords[1] + 1无法解决问题,就像here一样。

1 个答案:

答案 0 :(得分:3)

您反复向coords添加相同的stack引用。当您更改coords时,stack的所有元素似乎都会发生变化。

您应该做的是附加coords副本

stack.append(coord[:])

[:]制作副本。