В чем разница между этими двумя двумерными массивами? - PullRequest
2 голосов
/ 22 марта 2011

Я писал программу, которая нуждается в 2d-массиве, и столкнулся со странной проблемой.

Сначала я написал:

board = [[]]*11

для создания одиннадцати массивов в массиве.

Затем мне нужно было одиннадцать пробелов в каждом массиве, поэтому я написал:

for i in range(11):
    board[i].append(' ')

Я хотел заполнить третий массив, от 4 до 7, звездами, поэтому я написал:

for i in range(4, 7):
    board[2][i] = '*'

Но неожиданно вместо того, чтобы код воздействовал только на третий массив, все массивы в «плате» были изменены.

Итак, конечно, я написал:

board2 = []
for i in range(11):
    board2.append([])

, чтобы создать мой массив, а затем написал:

for i in range(11):
    for i in range(11):
        board2[i].append(' ')

, чтобы создать мой массив из 11 массивов, содержащих 11 пробелов.

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

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

1 Ответ

7 голосов
/ 22 марта 2011

Список [[]] * 11 содержит 11 ссылок на тот же список .

Ваш второй пример создает 11 различных списков.

board = [[]]*11
#        ^^ this is called just once

board2 = []
for i in range(11):
    board2.append([])
#                 ^^ this is called 11 times, creating 11 different lists

Другой способ написать второй пример - использовать понимание списка:

[[] for i in range(11)]
...