Присоединение к многомерному списку индексов добавляется ко всем индексам - PullRequest
0 голосов
/ 02 января 2019

Я написал класс для создания и управления многомерным списком, который представляет сетку 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

Я пытался разобраться в этой проблеме некоторое время, но, похоже, не могу найти ответ.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

То, что происходит, более или менее таково (это должно быть само за себя):

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

Чтобы решить проблему, необходимо скопировать «содержимое» объекта, а не сам объект,например:

l2 = l1[:]

Но здесь вы можете найти гораздо больше: Как клонировать или скопировать список?

В вашем случае вы можете изменить свой методдо:

def make_new_grid(self, contents = []):
    return [[ contents[:] for col in self.size ] for row in self.size]
0 голосов
/ 02 января 2019

Вы продолжаете добавлять тот же объект , что и внутренний список :

grid[row].append(contents)

Поэтому, конечно, когда вы добавляете этот список , который является только отдельный объект во внешнем списке , изменения видны повсюду.

Вы можете добавить копию, чтобы исправить это:

grid[row].append(contents.copy())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...