【问题标题】:Appending to multi-dimensional list index appends to all indices追加到多维列表索引追加到所有索引
【发布时间】:2019-05-28 16:30:47
【问题描述】:

我编写了一个类来生成和操作代表 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

我已经尝试解决这个问题一段时间,但我似乎找不到答案。

【问题讨论】:

    标签: python list class multidimensional-array append


    【解决方案1】:

    正在发生的事情或多或少是这样的(应该不言自明):

    l1 = []
    l2 = l1
    l2.append(1) # <-- note l2
    print(l1) # <-- note l1
    #=> [1, 2, 3, 4]
    

    要解决这个问题,需要复制对象的“内容”而不是对象本身,例如:

    l2 = l1[:]
    

    但在这里你可以找到更多:How to clone or copy a list?

    在您的情况下,您可以将方法更改为:

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

    【讨论】:

      【解决方案2】:

      你一直在添加相同的对象作为内部列表

      grid[row].append(contents)
      

      当然,当你追加到那个列表,这是外部列表中唯一不同的对象,变化无处不在。

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

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

      【讨论】:

      • 当然!谢谢你。因为当一个对象被分配另一个对象时,它不会复制,只是重新标记它。早该发现问题所在。
      猜你喜欢
      • 2013-03-15
      • 2020-02-16
      • 2018-06-30
      • 2022-06-15
      • 2019-08-24
      • 2015-04-07
      • 2021-07-25
      • 2017-04-01
      • 1970-01-01
      相关资源
      最近更新 更多