83 lines
2.2 KiB
TeX
83 lines
2.2 KiB
TeX
\section{Standard Module \sectcode{copy}}
|
|
\label{module-copy}
|
|
\stmodindex{copy}
|
|
\renewcommand{\indexsubitem}{(copy function)}
|
|
\ttindex{copy}
|
|
\ttindex{deepcopy}
|
|
|
|
This module provides generic (shallow and deep) copying operations.
|
|
|
|
Interface summary:
|
|
|
|
\bcode\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}\ecode
|
|
%
|
|
For module specific errors, \code{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}
|
|
|
|
Python's \code{deepcopy()} operation avoids these problems by:
|
|
|
|
\begin{itemize}
|
|
|
|
\item
|
|
keeping a table 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,
|
|
nor stack trace, stack frame, nor file, socket, window, nor array, nor
|
|
any similar types.
|
|
|
|
Classes can use the same interfaces to control copying that they use
|
|
to control pickling: they can define methods called
|
|
\code{__getinitargs__()}, \code{__getstate__()} and
|
|
\code{__setstate__()}. See the description of module \code{pickle}
|
|
for information on these methods.
|
|
\refstmodindex{pickle}
|
|
\renewcommand{\indexsubitem}{(copy protocol)}
|
|
\ttindex{__getinitargs__}
|
|
\ttindex{__getstate__}
|
|
\ttindex{__setstate__}
|