ошибка назначения элемента списка многомерного списка Python - PullRequest
0 голосов
/ 28 июня 2018

Я определяю классную игру с размерами n, m. Метод init создает создает две доски, по одной для каждого игрока

class game:

def __init__(self, n, m):
    rows = [0 for _ in range m]
    self.board1 = [rows for _ in range n]
    self.board2 = [rows for _ in range n]

когда я назначаю значение для board1 [0] [0], оно также назначает то же значение для board1 [1] [0], board1 [2] [0], ... board1 [n] [0] как ну как board2 [0-n] [0]

например,

game(3,4)
game.board1[0][0] = 1
print("board 1: {}\nboard 2: {}).format(self.board1, self.board2))

возвращает

board 1: [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
board 2: [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Сначала рабочий код:

class game:

def __init__(self, n, m):
    self.board1 = [ [0]*m for _ in range(n) ]
    self.board2 = [ [0]*m for _ in range(n) ]

new_game = game(3,4)
new_game.board1[0][1] = 1
print("board 1: {}\nboard 2: {}".format(new_game.board1, new_game.board2))

Почему это работает, а не то, что вы написали? Потому что, когда вы создаете rows = [0 for _ in range m] и затем передаете его на разные доски, он просто передает один и тот же объект несколько раз на обе доски. Таким образом, вместо ваших досок быть

[rows1, rows2, rows3]

Они

[rows, rows, rows]

И поскольку он ссылается на один и тот же объект, когда вы изменяете один из них, вы получаете одинаковое значение, отраженное через.

0 голосов
/ 28 июня 2018

Ваш код говорит, что self.board[n] = rows является объектом. Для экономии памяти питон не копирует объекты, на которые он может просто ссылаться. Вы можете использовать команду id(obj), чтобы увидеть, что все они ссылаются на один и тот же объект.

In [34]: id(game.board1[0])
Out[34]: 4439424520

In [35]: id(game.board1[1])
Out[35]: 4439424520

In [36]: id(game.board2[1])
Out[36]: 4439424520
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...