Spec-Zone.ru › Python 3.10

копирование — операции поверхностного и глубокого копирования

Исходный код: 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 в качестве второго аргумента. Словарь memo должен рассматриваться как непрозрачный объект.

См. также

Module pickle

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

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

Spec-Zone.ru

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