Вывод — [[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: общими становятся строки.