Python ссылка на вложенный список (2D-массив) - PullRequest
1 голос
/ 06 февраля 2020

Глядя на мой код ... почему мой первый вложенный список (grid1) не совпадает со вторым вложенным списком (grid2)? Чем отличается использование? Для игры я хочу, чтобы сетка 4 на 6 с каждым элементом, имеющим значение 'x', кроме сетки [0] [0], была назначена на 'O'. Это работает в grid2 , но не в grid1 . Почему ссылки и список отличаются, поскольку они выглядят одинаково?

#setup grid1 (4x6 2D nested list) populating x's in all positions
grid1 =[["x"]*4]*6]

grid1[0][0]="O"      #assign row 1, column 1 'O'
print(grid1)         

выводит

[['O', 'x', 'x', 'x'], ['O', 'x', 'x', 'x'], ['O', 'x', 'x', 'x'], ['O', 'x', 'x', 'x'], ['O', 'x', 'x', 'x'], ['O', 'x', 'x', 'x']]

все же эта реализация ...

grid2 = []  
for row in range(0,6):
    grid2.append([])
    for column in range(0,4):
        grid2[row].append("x")

grid2[0][0]="O"

print(grid2)

выводит правильно

[['O', 'x', 'x', 'x'], ['x', 'x', 'x', 'x'], ['x', 'x', 'x', 'x'], ['x', 'x', 'x', 'x'], ['x', 'x', 'x', 'x'], ['x', 'x', 'x', 'x']]

В чем разница и чем они отличаются?

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Похоже на grid1 в строке [["x"] * 4] * 6, операция '* 6' создает список из шести ["x", "x", "x", "x" ] но те же ссылки. Это означает, что изменение любого из шести ["x", "x", "x", "x"] изменит другие, так как они ссылаются на один и тот же объект в памяти.

Вы создаете свой собственный класс списка который переопределяет mul () для глубокого копирования списков, предшествующих во время умножения списка.

0 голосов
/ 06 февраля 2020

Вы можете использовать понимание списка:

grid3 = [ ["x"] * 4 for i in range(4) ]
grid3[0][0]="O"
print(grid3)

, чтобы достичь своей цели более кратким способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...