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