# `copy` — Shallow and deep copy operations

Вихідний код: Lib/copy.py

Оператори присвоєння в Python не копіюють об’єкти, вони створюють прив’язки між метою та об’єктом. Для колекцій, які є змінними або містять змінні елементи, іноді потрібна копія, щоб можна було змінити одну копію, не змінюючи іншу. Цей модуль забезпечує загальні операції поверхневого та глибокого копіювання (пояснення нижче).

Короткий опис інтерфейсу:

copy.copy(obj)

  Return a shallow copy of obj.

copy.deepcopy(obj[, memo])

  Return a deep copy of obj.

copy.replace(obj, /, **changes)

  Creates a new object of the same type as obj, replacing fields with values from changes.

  Added in version 3.13.

exception copy.Error

  Піднято для конкретних помилок модуля.

Різниця між поверхневим і глибоким копіюванням актуальна лише для складених об’єктів (об’єктів, які містять інші об’єкти, наприклад списки чи екземпляри класу):

- Неглибока копія створює новий складений об’єкт, а потім (наскільки це можливо) вставляє в нього посилання на об’єкти, знайдені в оригіналі.

- Глибока копія створює новий складений об’єкт, а потім рекурсивно вставляє в нього копії об’єктів, знайдених в оригіналі.

З операціями глибокого копіювання часто існують дві проблеми, яких немає з операціями поверхневого копіювання:

- Рекурсивні об’єкти (складені об’єкти, які прямо чи опосередковано містять посилання на себе) можуть спричинити рекурсивний цикл.

- Оскільки глибока копія копіює все, що може скопіювати занадто багато, наприклад дані, які призначені для спільного використання між копіями.

Функція `deepcopy()` дозволяє уникнути цих проблем за допомогою:

- ведення словника `memo` об’єктів, уже скопійованих під час поточного проходу копіювання; і

- дозволяючи визначеним користувачем класам перевизначати операцію копіювання або набір скопійованих компонентів.

Цей модуль не копіює такі типи, як модуль, метод, трасування стека, фрейм стека, файл, сокет, вікно або будь-які подібні типи. Він «копіює» функції та класи (неглибокі та глибокі), повертаючи вихідний об’єкт без змін; це сумісно з тим, як вони обробляються модулем `pickle`.

Неглибокі копії словників можна зробити за допомогою `dict.copy()`, а списків — шляхом призначення частини всього списку, наприклад, `copied_list = original_list[:]`.

Класи можуть використовувати ті самі інтерфейси для керування копіюванням, які вони використовують для керування травленням. Перегляньте опис модуля `pickle` для отримання інформації про ці методи. Фактично, модуль `copy` використовує зареєстровані функції pickle з модуля `copyreg`.

In order for a class to define its own copy implementation, it can define special methods `__copy__()` and `__deepcopy__()`.

object.__copy__(self)

  Called to implement the shallow copy operation; no additional arguments are passed.

object.__deepcopy__(self, memo)

  Called to implement the deep copy operation; it is passed one argument, the memo dictionary. If the `__deepcopy__` implementation needs to make a deep copy of a component, it should call the `deepcopy()` function with the component as first argument and the memo dictionary as second argument. The memo dictionary should be treated as an opaque object.

Function `copy.replace()` is more limited than `copy()` and `deepcopy()`, and only supports named tuples created by `namedtuple()`, `dataclasses`, and other classes which define method `__replace__()`.

object.__replace__(self, /, **changes)

  This method should create a new object of the same type, replacing fields with values from changes.

Дивись також

Модуль `pickle`

  Обговорення спеціальних методів, які використовуються для підтримки пошуку та відновлення стану об’єкта.