Вы строите 2D-матрицу для задачи конкурентного программирования. Быстро и уверенно вы пишете: сетка = [[]] * 3 Три пустые строки, готовые для хранения ваших данных. Вы обновляете первую строку: сетка[0].append(1) Вы печатаете результат, ожидая [[1], [...
Вы строите 2D-матрицу для задачи конкурентного программирования. Быстро и уверенно вы пишете:
сетка = [[]] * 3
Три пустые строки, готовые для хранения ваших данных. Вы обновляете первую строку:
сетка[0].append(1)
Вы печатаете результат, ожидая [[1], [], []]. Вместо этого Python передает вам следующее:
print(сетка) # [[1], [1], [1]]
Менялась каждая строка. Не только тот, которого ты коснулся. Если вы уперлись в эту стену, вы попали прямо в ловушку умножения вложенных списков Python, одну из самых распространенных и самых запутанных ошибок для разработчиков, переходящих от простых списков к вложенным структурам данных. Это похоже на ошибку Python. Это не так. Это прямое следствие того, как Python обрабатывает ссылки на объекты, и как только вы поймете этот механизм, вы больше никогда на него не попадетесь. Давайте разберемся, почему это происходит и как правильно строить вложенные списки.
Проблемный код: ошибка, которая выглядит как волшебство (в плохом смысле)
Вот ловушка в чистом виде:
сетка = [[]] * 3
сетка[0].append(1)
print(grid) # Вывод: [[1], [1], [1]] -> Неожиданно!
На первый взгляд это выглядит вполне разумно. [[]] * 3 должно означать «три пустых списка», верно? И Grid[0].append(1) должен влиять только на первый.
Но Питон этого не делает.