copy
— Операции мелкого и глубокого копирования¶
Исходный код: Lib/copy.py
Операторы присваивания в Python не копируют объекты, они создают привязки между целью и объектом. Для коллекций, которые являются изменяемыми или содержат изменяемые элементы, иногда требуется копия, чтобы можно было изменить одну копию, не изменяя другую. Этот модуль обеспечивает общие операции мелкого и глубокого копирования (описано ниже).
Краткое описание интерфейса:
- copy.copy(x)¶
Верните уменьшенную копию x.
- copy.deepcopy(x[, memo])¶
Возвращает глубокую копию x.
- exception copy.Error¶
Возникает из-за ошибок, связанных с конкретным модулем.
Разница между поверхностным и глубоким копированием актуальна только для составных объектов (объектов, содержащих другие объекты, такие как списки или экземпляры классов).:
Поверхностная копия создает новый составной объект, а затем (насколько это возможно) вставляет в него ссылки на объекты, найденные в оригинале.
Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.
Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.
Рекурсивные объекты (составные объекты, которые прямо или косвенно содержат ссылку на себя) могут вызывать рекурсивный цикл.
Поскольку глубокое копирование копирует все, оно может копировать слишком много, например, данные, которые предназначены для совместного использования между копиями.
Функция deepcopy()
позволяет избежать этих проблем с помощью:
сохранение
memo
словаря объектов, уже скопированных во время текущего этапа копирования; ипозволяя определяемым пользователем классам переопределять операцию копирования или набор копируемых компонентов.
Этот модуль не копирует такие типы, как module, method, stack trace, stack frame, file, socket, window или любые подобные типы. Он выполняет «копирование» функций и классов (поверхностное и глубокое), возвращая исходный объект без изменений; это совместимо с тем, как они обрабатываются модулем pickle
.
Неглубокие копии словарей можно создать, используя dict.copy()
, а списков - назначив фрагмент всего списка, например, copied_list = original_list[:]
.
Классы могут использовать те же интерфейсы для управления копированием, что и для управления обработкой. Информацию об этих методах смотрите в описании модуля pickle
. Фактически, модуль copy
использует зарегистрированные функции pickle из модуля copyreg
.
Для того чтобы класс мог определить свою собственную реализацию копирования, он может определить специальные методы __copy__()
и __deepcopy__()
. Первый вызывается для реализации операции поверхностного копирования; дополнительные аргументы не передаются. Последний вызывается для реализации операции глубокого копирования; ему передается один аргумент - словарь memo
. Если реализации __deepcopy__()
необходимо создать глубокую копию компонента, она должна вызвать функцию deepcopy()
с компонентом в качестве первого аргумента и словарем memo в качестве второго аргумента. Словарь memo следует рассматривать как непрозрачный объект.
См.также
- Модуль
pickle
Обсуждение специальных методов, используемых для поддержки поиска и восстановления состояния объекта.