| \section{\module{copy} --- |
| Shallow and deep copy operations} |
| |
| \declaremodule{standard}{copy} |
| \modulesynopsis{Shallow and deep copy operations.} |
| |
| |
| This module provides generic (shallow and deep) copying operations. |
| \withsubitem{(in copy)}{\ttindex{copy()}\ttindex{deepcopy()}} |
| |
| Interface summary: |
| |
| \begin{verbatim} |
| import copy |
| |
| x = copy.copy(y) # make a shallow copy of y |
| x = copy.deepcopy(y) # make a deep copy of y |
| \end{verbatim} |
| % |
| For module specific errors, \exception{copy.error} is raised. |
| |
| The difference between shallow and deep copying is only relevant for |
| compound objects (objects that contain other objects, like lists or |
| class instances): |
| |
| \begin{itemize} |
| |
| \item |
| A \emph{shallow copy} constructs a new compound object and then (to the |
| extent possible) inserts \emph{references} into it to the objects found |
| in the original. |
| |
| \item |
| A \emph{deep copy} constructs a new compound object and then, |
| recursively, inserts \emph{copies} into it of the objects found in the |
| original. |
| |
| \end{itemize} |
| |
| Two problems often exist with deep copy operations that don't exist |
| with shallow copy operations: |
| |
| \begin{itemize} |
| |
| \item |
| Recursive objects (compound objects that, directly or indirectly, |
| contain a reference to themselves) may cause a recursive loop. |
| |
| \item |
| Because deep copy copies \emph{everything} it may copy too much, |
| e.g., administrative data structures that should be shared even |
| between copies. |
| |
| \end{itemize} |
| |
| The \function{deepcopy()} function avoids these problems by: |
| |
| \begin{itemize} |
| |
| \item |
| keeping a ``memo'' dictionary of objects already copied during the current |
| copying pass; and |
| |
| \item |
| letting user-defined classes override the copying operation or the |
| set of components copied. |
| |
| \end{itemize} |
| |
| This version does not copy types like module, class, function, method, |
| stack trace, stack frame, file, socket, window, array, or any similar |
| types. |
| |
| Classes can use the same interfaces to control copying that they use |
| to control pickling: they can define methods called |
| \method{__getinitargs__()}, \method{__getstate__()} and |
| \method{__setstate__()}. See the description of module |
| \refmodule{pickle}\refstmodindex{pickle} for information on these |
| methods. The \module{copy} module does not use the |
| \refmodule[copyreg]{copy_reg} registration module. |
| \withsubitem{(copy protocol)}{\ttindex{__getinitargs__()} |
| \ttindex{__getstate__()}\ttindex{__setstate__()}} |
| |
| In order for a class to define its own copy implementation, it can |
| define special methods \method{__copy__()} and |
| \method{__deepcopy__()}. The former is called to implement the |
| shallow copy operation; no additional arguments are passed. The |
| latter is called to implement the deep copy operation; it is passed |
| one argument, the memo dictionary. If the \method{__deepcopy__()} |
| implementation needs to make a deep copy of a component, it should |
| call the \function{deepcopy()} function with the component as first |
| argument and the memo dictionary as second argument. |
| \withsubitem{(copy protocol)}{\ttindex{__copy__()}\ttindex{__deepcopy__()}} |
| |
| \begin{seealso} |
| \seemodule{pickle}{Discussion of the special methods used to |
| support object state retrieval and restoration.} |
| \end{seealso} |