Spec-Zone.ru › Python 3.14

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.

Поверхностные копии многих коллекций можно создавать с помощью соответствующего метода copy() (например, list.copy(), dict.copy() или set.copy()), а последовательностей (например, списков или bytearray) — создавая срез всей последовательности (sequence[:]). Однако при копировании экземпляра подкласса эти методы и создание среза могут создать экземпляр базового типа, тогда как copy.copy() обычно возвращает экземпляр того же типа.

Классы могут использовать те же интерфейсы для управления копированием, что и для управления сериализацией. Сведения об этих методах см. в описании модуля 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.

См. также

Module pickle

Обсуждение специальных методов, используемых для поддержки получения и восстановления состояния объекта.

© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/copy.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API