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

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