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