: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 many collections can be made using the corresponding
:meth:`!copy` method (such as :meth:`list.copy`, :meth:`dict.copy` or
:meth:`set.copy`), and of sequences (such as lists or bytearrays) by making
a slice of the entire sequence (``sequence[:]``).
However, these methods and slicing can create an instance of the base type
when copying an instance of a subclass, whereas :func:`copy.copy` normally
returns an instance of the same type.

.. 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*.

   .. versionadded:: 3.13


.. seealso::

   Module :mod:`pickle`
      Discussion of the special methods used to support object state retrieval and
      restoration.

