копирование — операции поверхностного и глубокого копирования
Исходный код: Lib/copy.py
Операторы присваивания в Python не копируют объекты, они создают связи между целевой переменной и объектом. Для изменяемых коллекций или коллекций, содержащих изменяемые элементы, иногда требуется копия, чтобы можно было изменить одну копию без изменения другой. Этот модуль предоставляет универсальные операции поверхностного и глубокого копирования (объяснены ниже).
Резюме интерфейса:
-
copy.copy(x) -
Возвращает поверхностную копию x.
-
copy.deepcopy(x[, memo]) -
Возвращает глубокую копию x.
-
exception copy.Error -
Вызывается для ошибок, специфичных для модуля.
Разница между поверхностным и глубоким копированием актуальна только для составных объектов (объектов, содержащих другие объекты, таких как списки или экземпляры классов):
- Поверхностная копия создает новый составной объект и затем (в той мере, насколько это возможно) вставляет ссылки на объекты из оригинала.
- Глубокая копия создает новый составной объект и затем рекурсивно вставляет копии объектов из оригинала.
Часто существуют две проблемы при выполнении операций глубокого копирования, которые не возникают при поверхностном копировании:
- Рекурсивные объекты (составные объекты, которые прямо или косвенно содержат ссылку на себя) могут вызвать рекурсивный цикл.
- Поскольку глубокое копирование копирует все, оно может скопировать слишком много данных, таких как данные, которые должны быть общими между копиями.
Функция deepcopy() избегает этих проблем, используя:
- сохранение словаря
memoобъектов, уже скопированных во время текущего прохода копирования; и - позволение пользовательским классам переопределять операцию копирования или набор копируемых компонентов.
Этот модуль не копирует типы, такие как модули, методы, трассировки стека, кадры стека, файлы, сокеты, окна, массивы или любые аналогичные типы. Он «копирует» функции и классы (поверхностно и глубоко), возвращая исходный объект без изменений; это совместимо со способом обработки этих типов модулем pickle.
Поверхностные копии словарей можно создать с помощью dict.copy(), а списков — присвоив срез всего списка, например, copied_list = original_list[:].
Классы могут использовать те же интерфейсы для управления копированием, которые они используют для управления сериализацией. См. описание модуля pickle для получения информации об этих методах. На самом деле, модуль copy использует зарегистрированные функции сериализации из модуля copyreg.
Чтобы класс определил свою собственную реализацию копирования, он может определить специальные методы __copy__() и __deepcopy__(). Первый используется для реализации поверхностного копирования; дополнительные аргументы не передаются. Второй используется для реализации глубокого копирования; ему передается один аргумент, словарь memo. Если реализации __deepcopy__() необходимо сделать глубокую копию компонента, она должна вызвать функцию deepcopy() с компонентом в качестве первого аргумента и словарем memo в качестве второго.
См. также
-
Modulepickle -
Описание специальных методов, используемых для поддержки извлечения и восстановления состояния объекта.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/copy.html