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

copy.md

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

1> **Источник:** https://python-all.ru/3.0/library/copy.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `copy` – Операции поверхностного и глубокого копирования89Этот модуль предоставляет универсальные операции (поверхностного и глубокого) копирования.1011Краткое описание интерфейса:1213```python14import copy1516x = copy.copy(y)        # создать поверхностную копию y17x = copy.deepcopy(y)    # создать глубокую копию y18```1920Для ошибок, специфичных для модуля, возбуждается `copy.error`.2122Разница между поверхностным и глубоким копированием актуальна только для составных объектов (объектов, содержащих другие объекты, например, списки или экземпляры классов):2324- *Поверхностная копия* создаёт новый составной объект, а затем (насколько это возможно) вставляет в него *ссылки* на объекты, найденные в оригинале.25- *Глубокая копия* создаёт новый составной объект, а затем рекурсивно вставляет в него *копии* объектов из оригинала.2627Две проблемы, часто возникающие при глубоком копировании, которых нет при поверхностном:2829- Рекурсивные объекты (составные объекты, прямо или косвенно содержащие ссылку на себя) могут вызвать рекурсивный цикл.30- Поскольку глубокое копирование копирует *всё*, оно может скопировать слишком много, например, административные структуры данных, которые должны быть общими даже между копиями.3132Функция `deepcopy()` позволяет избежать этих проблем следующим образом:3334- хранение словаря “memo”, содержащего объекты, уже скопированные в текущем проходе копирования; и35- предоставления пользовательским классам возможности переопределить операцию копирования или набор копируемых компонентов.3637Этот модуль не копирует такие типы, как модуль, метод, трассировка стека, кадр стека, файл, сокет, окно, массив и любые подобные типы. Он «копирует» функции и классы (поверхностно и глубоко), возвращая исходный объект без изменений; это совместимо с тем, как эти типы обрабатываются модулем [`pickle`](https://python-all.ru/3.0/library/pickle.html#module-pickle).3839Поверхностные копии словарей можно создать с помощью [`dict.copy()`](https://python-all.ru/3.0/library/stdtypes.html#dict.copy), а копии списков – присваиванием среза всего списка, например, `copied_list = original_list[:]`.4041Классы могут использовать те же интерфейсы для управления копированием, которые они используют для управления pickling. См. описание модуля [`pickle`](https://python-all.ru/3.0/library/pickle.html#module-pickle) для получения информации об этих методах. Модуль `copy` не использует [`copyreg`](https://python-all.ru/3.0/library/copyreg.html#module-copyreg) регистрационный модуль.4243Чтобы класс мог определить собственную реализацию копирования, он может определить специальные методы `__copy__()` и `__deepcopy__()`. Первый вызывается для реализации операции поверхностного копирования; дополнительные аргументы не передаются. Второй вызывается для реализации операции глубокого копирования; ему передаётся один аргумент – словарь memo. Если реализация `__deepcopy__()` требует создать глубокую копию компонента, следует вызвать функцию `deepcopy()`, передав компонент первым аргументом, а словарь memo – вторым.4445> **См. также**46>47> **Модуль [`pickle`](https://python-all.ru/3.0/library/pickle.html#module-pickle)**48>49> Обсуждение специальных методов, используемых для поддержки извлечения и восстановления состояния объекта.50