Поверхностное и глубокое копирование в Python

Перевод статьи Python Shallow Copy and Deep Copy.

Копирование объектов в Python

Оператор присваивания = не создаёт копию объекта. Присваивание создаёт новую переменную которая дублирует ссылку на исходный объект.

Рассмотрим пример

После запуска программа выдаст следующее:

Обе переменные ссылаются на один объект, это подтверждает одинаковый идентификатор объекта 140673303268168. Так что при изменении значений в переменных new_list и old_list, изменение будет видно в обоих переменных.

Иногда нужно оставить исходное значение без изменений и модифицировать только новое. В Python, есть два способа сделать копию: поверхностное копирование и глубокое копирование.

Модуль Copy

Модуль copy используется для поверхностного и глубокого копирования. Например:

Метод copy() возвращает поверхностную копию x, а метод deepcopy() возвращает глубокую копию x.

Поверхностное копирование

Поверхностное копирование создаёт новый объект и копирует ссылки на все вложенные объекты. Это означает что процесс копирования не рекурсивный и не создаёт копий вложенных объектов.

Вывод программы:

В программе выше, мы создали вложенный список и его поверхностную копию методом copy(). Это означает что мы создали независимый объект с тем же содержимым.

Чтобы проверить что объекты разные добавим в один из списков новый элемент:

Вывод программы:

Изменения в исходном списке (old_list) не повлияли на новый список (new_list).

Попробуем изменить один из вложенных объектов:

Вывод программы:

Мы изменили вложенный в в оригинальный объект список (old_list[1]). Так как ссылки на вложенные элементы в двух списках одинаковые, изменение вложенного списка отразилось и на old_list и на new_list.

Глубокое копирование

Глубокое копирование создаёт новый объект и рекурсивно добавляет в него копии вложенных объектов из исходного объекта.

Вывод программы:

В этом примере не видно отличий от использования функции copy(). Изменения видны если модифицировать вложенный список:

Вывод программы:

Изменения видны только в списке old_list, так как список new_list содержит копии всех вложенных объектов.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *