Назад к подготовке

Изменяемые объекты и копирование списков в 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 без необходимости на больших объектах.