|  | :mod:`copy` --- Shallow and deep copy operations | 
|  | ================================================ | 
|  |  | 
|  | .. module:: copy | 
|  | :synopsis: Shallow and deep copy operations. | 
|  |  | 
|  | **Source code:** :source:`Lib/copy.py` | 
|  |  | 
|  | -------------- | 
|  |  | 
|  | Assignment statements in Python do not copy objects, they create bindings | 
|  | between a target and an object. For collections that are mutable or contain | 
|  | mutable items, a copy is sometimes needed so one can change one copy without | 
|  | changing the other. This module provides generic shallow and deep copy | 
|  | operations (explained below). | 
|  |  | 
|  |  | 
|  | Interface summary: | 
|  |  | 
|  | .. function:: copy(obj) | 
|  |  | 
|  | Return a shallow copy of *obj*. | 
|  |  | 
|  |  | 
|  | .. function:: deepcopy(obj[, memo]) | 
|  |  | 
|  | Return a deep copy of *obj*. | 
|  |  | 
|  |  | 
|  | .. function:: replace(obj, /, **changes) | 
|  |  | 
|  | Creates a new object of the same type as *obj*, replacing fields with values | 
|  | from *changes*. | 
|  |  | 
|  | .. versionadded:: 3.13 | 
|  |  | 
|  |  | 
|  | .. exception:: Error | 
|  |  | 
|  | Raised for module specific errors. | 
|  |  | 
|  | .. _shallow_vs_deep_copy: | 
|  |  | 
|  | The difference between shallow and deep copying is only relevant for compound | 
|  | objects (objects that contain other objects, like lists or class instances): | 
|  |  | 
|  | * A *shallow copy* constructs a new compound object and then (to the extent | 
|  | possible) inserts *references* into it to the objects found in the original. | 
|  |  | 
|  | * A *deep copy* constructs a new compound object and then, recursively, inserts | 
|  | *copies* into it of the objects found in the original. | 
|  |  | 
|  | Two problems often exist with deep copy operations that don't exist with shallow | 
|  | copy operations: | 
|  |  | 
|  | * Recursive objects (compound objects that, directly or indirectly, contain a | 
|  | reference to themselves) may cause a recursive loop. | 
|  |  | 
|  | * Because deep copy copies everything it may copy too much, such as data | 
|  | which is intended to be shared between copies. | 
|  |  | 
|  | The :func:`deepcopy` function avoids these problems by: | 
|  |  | 
|  | * keeping a ``memo`` dictionary of objects already copied during the current | 
|  | copying pass; and | 
|  |  | 
|  | * letting user-defined classes override the copying operation or the set of | 
|  | components copied. | 
|  |  | 
|  | This module does not copy types like module, method, stack trace, stack frame, | 
|  | file, socket, window, or any similar types.  It does "copy" functions and | 
|  | classes (shallow and deeply), by returning the original object unchanged; this | 
|  | is compatible with the way these are treated by the :mod:`pickle` module. | 
|  |  | 
|  | Shallow copies of dictionaries can be made using :meth:`dict.copy`, and | 
|  | of lists by assigning a slice of the entire list, for example, | 
|  | ``copied_list = original_list[:]``. | 
|  |  | 
|  | .. index:: pair: module; pickle | 
|  |  | 
|  | Classes can use the same interfaces to control copying that they use to control | 
|  | pickling.  See the description of module :mod:`pickle` for information on these | 
|  | methods.  In fact, the :mod:`copy` module uses the registered | 
|  | pickle functions from the :mod:`copyreg` module. | 
|  |  | 
|  | .. index:: | 
|  | single: __copy__() (copy protocol) | 
|  | single: __deepcopy__() (copy protocol) | 
|  |  | 
|  | .. currentmodule:: None | 
|  |  | 
|  | In order for a class to define its own copy implementation, it can define | 
|  | special methods :meth:`~object.__copy__` and :meth:`~object.__deepcopy__`. | 
|  |  | 
|  | .. method:: object.__copy__(self) | 
|  | :noindexentry: | 
|  |  | 
|  | Called to implement the shallow copy operation; | 
|  | no additional arguments are passed. | 
|  |  | 
|  | .. method:: object.__deepcopy__(self, memo) | 
|  | :noindexentry: | 
|  |  | 
|  | 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 :func:`~copy.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. | 
|  |  | 
|  |  | 
|  | .. index:: | 
|  | single: __replace__() (replace protocol) | 
|  |  | 
|  | Function :func:`!copy.replace` is more limited | 
|  | than :func:`~copy.copy` and :func:`~copy.deepcopy`, | 
|  | and only supports named tuples created by :func:`~collections.namedtuple`, | 
|  | :mod:`dataclasses`, and other classes which define method :meth:`~object.__replace__`. | 
|  |  | 
|  | .. method:: object.__replace__(self, /, **changes) | 
|  | :noindexentry: | 
|  |  | 
|  | This method should create a new object of the same type, | 
|  | replacing fields with values from *changes*. | 
|  |  | 
|  |  | 
|  | .. seealso:: | 
|  |  | 
|  | Module :mod:`pickle` | 
|  | Discussion of the special methods used to support object state retrieval and | 
|  | restoration. | 
|  |  |