二维数组在python中无法正常工作

2024-05-18 23:40:36 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试图用一个二维数组在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]]

我真的不知道是什么原因造成的,但这真的很烦人,我真的很想得到一些帮助


Tags: 函数infalsetrue游戏for错误range
3条回答

这是一个别名问题。 列表是python中的一个对象,在这里,您将gridY作为列表对象进行减速,并不断更改它。通过不断地将其添加到grid中,您不会创建不同长度的新对象,而是多次添加同一对象。当您尝试一次更改时,您正在整个grid中更改它

发生的事情是grid数组正在内存中存储指向同一gridY部分的许多指针。当您更改一个指针时,整个gridY将更改。因此,当您将gridY中的一个False更改为True时,整个gridY都会更改。 你可以用

def MakeGrid(height):
    gridY = []
    grid = []
    for i in range(height):
        gridY.append(False)
    for i in range(height):
        grid.append(gridY[:])
    return(grid)

def MakeGrid(height):
    gridY = []
    grid = []
    for i in range(height):
        gridY.append(False)
    for i in range(height):
        grid.append(gridY.copy())
    return(grid)

如@Epsi95所述

这不是一个bug,而是反复添加完全相同的列表时的预期行为。由于您将相同的列表(gridY)附加到grid中,因此它们在grid中共享相同的内存;这意味着grid内任何列表中一个(或多个)元素的更改将应用于grid内的所有其他列表,因为它们是同一对象

请看以下内容:

x = [1, 2, 3]
y = []
y.append(x)
y.append(x)
y[0] == x  # True (same list contents)
y[0] is x  # Also True! (same memory, exact same list)

因此,您需要附加该列表的副本,该副本不共享相同的内存/标识,而是使用.copy()添加相同的内容

相关问题 更多 >

    热门问题