Используя [[0] * 5] * no_of_flowers
, вы создаете 100 ссылок на один и тот же список.Это означает, что в памяти ТОЛЬКО ОДНА СТРОКА .
Когда вы изменяете строку, если она влияет на строку в памяти, и поскольку все остальные «строки» ссылаются на нее, они просто будут использовать список в памяти, который обновлен.
Чтобы избежать этого сценария, вы можете использовать:
flower = [[0 for _ in range(5)] for _ in range(no_of_flowers)]
Вы можете найти пример и объяснение в wtfpython :
# Let's initialize a row
row = [""]*3 #row i['', '', '']
# Let's make a board
board = [row]*3
Вывод:
>>> board
[['', '', ''], ['', '', ''], ['', '', '']]
>>> board[0]
['', '', '']
>>> board[0][0]
''
>>> board[0][0] = "X"
>>> board
[['X', '', ''], ['X', '', ''], ['X', '', '']]
Объяснение:
Когда мы инициализируем переменную row
, эта визуализация объясняет, что происходит в памяти.

И когда board
инициализируется умножением row
, это то, что происходит внутри памяти (каждый из элементов board[0]
, board[1]
и board[2]
является ссылкой на тот же список, на который ссылается row
)

Мы можем избежать этого сценария, не используя row
переменная для генерации board
.(Спрашивается в этом выпуске).
>>> board = [['']*3 for _ in range(3)]
>>> board[0][0] = "X"
>>> board
[['X', '', ''], ['', '', ''], ['', '', '']]