首页 > 解决方案 > 追加到多维列表索引追加到所有索引

问题描述

我编写了一个类来生成和操作代表 9 x 9 网格的多维列表。我有一个产生这个列表的方法。该列表似乎生成得很好,但是当我尝试附加到特定索引时,它会附加到所有列表中。

class Grid:
    def __init__(self):
        self.size = range(9)
        self.grid = self.make_new_grid([])

    def make_new_grid(self, contents):
        grid = []
        for row in self.size:
            grid.append([])
            for column in self.size:
                grid[row].append(contents)
        return grid

grid = Grid()
grid.grid[4][5].append(8)
print('class grid', grid.grid)

输出:

class grid [[[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]]]

为了测试这一点,我对同一个网格进行了硬编码并做了同样的事情。我得到的输出符合预期。

compare_grid = [[[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []]]
compare_grid[4][5].append(8)
print(compare_grid)

输出:

comparison grid [[[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [8], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []]]

最后我测试了类生成的网格和我的硬编码网格是否相等:

grid = Grid()
compare_grid = [[[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []],
                [[], [], [], [], [], [], [], [], []]]
print(grid.grid==compare_grid)

输出:

True

我试图解决这个问题一段时间,但我似乎无法找到答案。

标签: pythonlistclassmultidimensional-arrayappend

解决方案


您继续附加与内部列表相同的对象:

grid[row].append(contents)

因此,当然,当您追加到该列表时,它是外部列表中唯一不同的对象,更改随处可见。

您可以附加一个副本来解决此问题:

grid[row].append(contents.copy())

推荐阅读