Что произойдёт при умножении списка и последующем изменении его элемента?

Вывод — [[1], [1], [1]]. Умножение списка копирует ссылки на один вложенный список, а не создаёт три независимых объекта.

Короткий ответ

Что ответить на собеседовании

Вывод — [[1], [1], [1]]. Умножение списка копирует ссылки на один вложенный список, а не создаёт три независимых объекта.

Подробный разбор

Ответ с пояснениями

Условие

Каким будет вывод программы и почему? Рассмотрим код, в котором список создаётся умножением и затем изменяется один из его элементов.

matrix = [[]] * 3
matrix[1].append(1)
print(matrix)

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

Ответ

Вывод — [[1], [1], [1]]. Умножение списка копирует ссылки на один вложенный список, а не создаёт три независимых объекта.

Выражение [[]] сначала создаёт один пустой список внутри внешнего. Оператор * 3 повторяет ссылку на него три раза. Поэтому matrix[1].append(1) меняет объект, видимый через все три позиции.

assert matrix[0] is matrix[1] is matrix[2]

Для независимых строк матрицы используйте comprehension:

matrix = [[] for _ in range(3)]
matrix[1].append(1)
# [[], [1], []]

Здесь пустой список создаётся на каждой итерации заново. Такая же ошибка возникает при построении числовых матриц выражением [[0] * columns] * rows: общими становятся строки.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее