Spec-Zone.ru › Python 3.5

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

Исходный код: Lib/copy.py

Операторы присваивания в Python не копируют объекты, они создают связи между целевой переменной и объектом. Для изменяемых коллекций или коллекций, содержащих изменяемые элементы, иногда требуется копия, чтобы можно было изменить одну копию, не изменяя другую. Этот модуль предоставляет общие операции поверхностного и глубокого копирования (объяснены ниже).

Резюме интерфейса:

copy.copy(x)

Возвращает поверхностную копию x.

copy.deepcopy(x)

Возвращает глубокую копию 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.5/library/copy.html

Spec-Zone.ru

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