所以我试图用一个二维数组在python中重新创建生活游戏,但我偶然发现了一个非常奇怪的错误。 为了制作数组,我制作了以下函数:
def MakeGrid(height):
gridY = []
grid = []
for i in range(height):
gridY.append(False)
for i in range(height):
grid.append(gridY)
return(grid)
但是有一个非常奇怪的错误,如果我试图在一个点上把一个假变为真,它会沿着对角线到处变化。 下面是一个例子:
grid = MakeGrid(2) # grid is now [[False,False], [False,False]]
grid[0][0] = True #grid should be [[True, False], [False, False]], but it's actually [[True, False], [True, False]]
我真的不知道是什么原因造成的,但这真的很烦人,我真的很想得到一些帮助
这是一个别名问题。 列表是python中的一个对象,在这里,您将
gridY
作为列表对象进行减速,并不断更改它。通过不断地将其添加到grid
中,您不会创建不同长度的新对象,而是多次添加同一对象。当您尝试一次更改时,您正在整个grid
中更改它发生的事情是
grid
数组正在内存中存储指向同一gridY
部分的许多指针。当您更改一个指针时,整个gridY
将更改。因此,当您将gridY
中的一个False
更改为True
时,整个gridY
都会更改。 你可以用或
如@Epsi95所述
这不是一个bug,而是反复添加完全相同的列表时的预期行为。由于您将相同的列表(
gridY
)附加到grid
中,因此它们在grid
中共享相同的内存;这意味着grid
内任何列表中一个(或多个)元素的更改将应用于grid
内的所有其他列表,因为它们是同一对象请看以下内容:
因此,您需要附加该列表的副本,该副本不共享相同的内存/标识,而是使用
.copy()
添加相同的内容相关问题 更多 >
编程相关推荐