Spec-Zone.ru › Python 3.6

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

Исходный код: 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 в качестве второго аргумента.

См. также

Module pickle

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

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

Spec-Zone.ru

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