附加到多维列表索引将附加到所有索引

时间:2019-01-01 22:11:15

标签: python list class multidimensional-array append

我写了一个类来生成和处理代表9 x 9网格的多维列表。我有一种方法可以生成此列表。列表似乎制作得很好,但是当我尝试附加到特定索引时,它将附加到所有列表。

bfill

输出:

dfr.a=dfr.bfill(1).a
dfr
      a    b    c   d
0   4.0  4.0  4.0   3
1   5.0  NaN  5.0   1
2   3.0  NaN  6.0   3
3   7.0  7.0  7.0   9
4  12.0  NaN  NaN  12

为了测试这一点,我对相同的网格进行了硬编码并执行了相同的操作。我得到的输出符合预期。

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], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []]]

我试图解决这个问题已有一段时间了,但是我似乎找不到答案。

2 个答案:

答案 0 :(得分:0)

您不断添加与内部列表相同的对象

grid[row].append(contents)

因此,当然,当您将那个列表添加到外部列表内的唯一的不同对象时,随处可见更改。

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

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

答案 1 :(得分:0)

正在发生的事情或多或少是这个(应该是自我解释的):

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]