Какой вариант, по вашему мнению, будет правильным?
Большинство без проблем отвечают на первые две строки:
numbers * 3 создаёт новый список: [1, 2, 3, 1, 2, 3, 1, 2, 3]
А numbers + [4, 5] объединяет два списка: [1, 2, 3, 4, 5]
Но третья строка уже гораздо интереснее.
[numbers] * 3
Результат выглядит так:
[[1, 2, 3],
[1, 2, 3],
[1, 2, 3]]
Кажется, что Python создал три независимых списка.
Оператор * не копирует вложенные объекты. Он копирует ссылки на них.
В результате все элементы списка указывают на один и тот же объект в памяти.
Это одна из самых частых ошибок
Подобная конструкция регулярно встречается при создании:
- матриц;
- игровых полей;
- двумерных массивов;
- таблиц динамического программирования.
И может привести к очень неожиданным ошибкам.
Как сделать правильно?
Если нужны независимые вложенные списки, используйте генератор списка:
matrix = [[1, 2, 3] for _ in range(3)]
Теперь каждая строка будет отдельным объектом.
💡 Запомните правило
Если используете оператор * со вложенными изменяемыми объектами — подумайте дважды.
Он копирует не сами объекты, а ссылки на них.