Документация Python неофициальный перевод

copy.md

79 строк · 8.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.15/library/copy.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `copy` – операции поверхностного и глубокого копирования89**Исходный код:** [Lib/copy.py](https://python-all.ru/src/3.15/Lib/copy.py)1011---1213Операторы присваивания в Python не копируют объекты, они создают привязки между целью и объектом. Для изменяемых коллекций или коллекций, содержащих изменяемые элементы, иногда требуется копия, чтобы можно было изменить одну копию, не меняя другую. Этот модуль предоставляет общие операции поверхностного и глубокого копирования (объяснены ниже).1415Краткое описание интерфейса:1617#### `copy.copy(obj)`1819Возвращает поверхностную копию *obj*.2021#### `copy.deepcopy(obj[, memo])`2223Возвращает глубокую копию *obj*.2425#### `copy.replace(obj, /, **changes)`2627Создаёт новый объект того же типа, что и *obj*, заменяя поля значениями из *changes*.2829Добавлено в версии 3.13.3031#### `exception copy.Error`3233Возбуждается при ошибках, специфичных для модуля.3435Разница между поверхностным и глубоким копированием актуальна только для составных объектов (объектов, содержащих другие объекты, например, списки или экземпляры классов):3637- *Поверхностная копия* создаёт новый составной объект, а затем (насколько это возможно) вставляет в него *ссылки* на объекты, найденные в оригинале.38- *Глубокая копия* создаёт новый составной объект, а затем рекурсивно вставляет в него *копии* объектов из оригинала.3940Две проблемы, часто возникающие при глубоком копировании, которых нет при поверхностном:4142- Рекурсивные объекты (составные объекты, прямо или косвенно содержащие ссылку на себя) могут вызвать рекурсивный цикл.43- Поскольку глубокое копирование копирует всё, оно может скопировать лишнее, например, данные, предназначенные для совместного использования между копиями.4445Функция [`deepcopy()`](https://python-all.ru/3.15/library/copy.html#copy.deepcopy) позволяет избежать этих проблем за счёт:4647- ведения словаря `memo` уже скопированных объектов в текущем проходе копирования; и48- предоставления пользовательским классам возможности переопределить операцию копирования или набор копируемых компонентов.4950Этот модуль не копирует такие типы, как модуль, метод, трассировка стека, кадр стека, файл, сокет, окно или любые подобные типы. Он «копирует» функции и классы (поверхностно и глубоко), возвращая исходный объект без изменений; это совместимо с тем, как эти типы обрабатываются модулем [`pickle`](https://python-all.ru/3.15/library/pickle.html#module-pickle).5152Поверхностные копии многих коллекций можно получить с помощью соответствующего метода `copy()` (например, [`list.copy()`](https://python-all.ru/3.15/library/stdtypes.html#list.copy), [`dict.copy()`](https://python-all.ru/3.15/library/stdtypes.html#dict.copy) или [`set.copy()`](https://python-all.ru/3.15/library/stdtypes.html#set.copy)), а последовательностей (например, списков или bytearray) – с помощью среза всей последовательности (`sequence[:]`). Однако эти методы и срез могут создать экземпляр базового типа при копировании экземпляра подкласса, тогда как [`copy.copy()`](https://python-all.ru/3.15/library/copy.html#copy.copy) обычно возвращает экземпляр того же типа.5354Классы могут использовать те же интерфейсы для управления копированием, что и для управления сериализацией (pickling). См. описание модуля [`pickle`](https://python-all.ru/3.15/library/pickle.html#module-pickle) для получения информации об этих методах. Фактически, модуль `copy` использует зарегистрированные функции pickle из модуля [`copyreg`](https://python-all.ru/3.15/library/copyreg.html#module-copyreg).5556Чтобы класс мог определить собственную реализацию копирования, он может определить специальные методы [`__copy__()`](https://python-all.ru/3.15/library/copy.html#object.__copy__) и [`__deepcopy__()`](https://python-all.ru/3.15/library/copy.html#object.__deepcopy__).5758#### `object.__copy__(self)`5960Вызывается для реализации операции поверхностного копирования; дополнительные аргументы не передаются.6162#### `object.__deepcopy__(self, memo)`6364Вызывается для реализации операции глубокого копирования; ему передаётся один аргумент – словарь *memo*. Если реализация `__deepcopy__` должна сделать глубокую копию компонента, ей следует вызвать функцию [`deepcopy()`](https://python-all.ru/3.15/library/copy.html#copy.deepcopy), передав компонент первым аргументом и словарь *memo* вторым. Словарь *memo* следует рассматривать как непрозрачный объект.6566Функция `copy.replace()` более ограничена, чем [`copy()`](https://python-all.ru/3.15/library/copy.html#copy.copy) и [`deepcopy()`](https://python-all.ru/3.15/library/copy.html#copy.deepcopy), и поддерживает только именованные кортежи, созданные [`namedtuple()`](https://python-all.ru/3.15/library/collections.html#collections.namedtuple), [`dataclasses`](https://python-all.ru/3.15/library/dataclasses.html#module-dataclasses) и другими классами, которые определяют метод [`__replace__()`](https://python-all.ru/3.15/library/copy.html#object.__replace__).6768#### `object.__replace__(self, /, **changes)`6970Этот метод должен создать новый объект того же типа, заменяя поля значениями из *изменений*.7172Добавлено в версии 3.13.7374> **См. также**75>76> **Модуль [`pickle`](https://python-all.ru/3.15/library/pickle.html#module-pickle)**77>78> Обсуждение специальных методов, используемых для поддержки извлечения и восстановления состояния объекта.79