Изменяемые объекты и копирование списков в Python
Что произойдет, если присвоить один список другой переменной и изменить его? Чем отличаются shallow copy и deep copy?
Ответить самому
Сначала сформулируйте ответ как на собеседовании, затем откройте разбор и оцените себя.
Короткий ответ
Присваивание не копирует список, а добавляет новую ссылку на тот же объект. Shallow copy копирует внешний контейнер, но вложенные объекты остаются общими. Deep copy рекурсивно копирует вложенные объекты.
Полный разбор
В Python переменная хранит ссылку на объект. Если написать b = a, где a - список, то a и b указывают на один и тот же список. Поэтому b.append(1) изменит объект, который виден и через a.
Shallow copy можно сделать через a.copy(), list(a) или a[:]. Она создает новый внешний список, но элементы внутри остаются теми же объектами. Если внутри лежит вложенный список, изменение вложенного списка будет видно в обеих копиях.
Deep copy из модуля copy рекурсивно копирует вложенные объекты. Она нужна для сложных структур, но может быть дорогой и не всегда желательной, если часть объектов должна оставаться общей.
Теория
Разница между именем, ссылкой и объектом - базовая часть Python memory model.
Типичные ошибки
- Думать, что `b = a` создает новый список.
- Использовать shallow copy для вложенных изменяемых структур.
- Делать deepcopy без необходимости на больших объектах.