【发布时间】:2015-02-24 05:56:27
【问题描述】:
我需要使用堆栈来推送和弹出包含 2 个数字的列表,这些数字在我正在制作的程序中用作 XY 坐标。看起来很简单,所以我就这样做了
stack = []
制作我将用作堆栈的列表。现在我使坐标变量
coord = [0,0]
并将其压入堆栈。
stack.append(coord)
现在,堆栈等于
[[0, 0]]
这是完美的。现在假设我向上移动了一个,所以我的坐标变量 Y 值更新为
coord[1] += 1
坐标等于
[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 一样。
【问题讨论】:
-
另见Python list of lists, changes reflected across sublists unexpectedly 和相关链接。如需进一步讨论,请参阅 SO 坚定的 Ned Batchelder 的 Facts and myths about Python names and values。