mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 03:22:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			98 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
\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}
 |