<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<link rel=
"STYLESHEET" href=
"lib.css" type='text/css'
/>
<link rel=
"SHORTCUT ICON" href=
"../icons/pyfav.png" type=
"image/png" />
<link rel='start' href='../index.html' title='Python Documentation Index'
/>
<link rel=
"first" href=
"lib.html" title='Python Library Reference'
/>
<link rel='contents' href='contents.html'
title=
"Contents" />
<link rel='index' href='genindex.html' title='Index'
/>
<link rel='last' href='about.html' title='About this document...'
/>
<link rel='help' href='about.html' title='About this document...'
/>
<link rel=
"next" href=
"module-marshal.html" />
<link rel=
"prev" href=
"module-shelve.html" />
<link rel=
"parent" href=
"python.html" />
<link rel=
"next" href=
"module-marshal.html" />
<meta name='aesop' content='information'
/>
<title>3.18 copy -- Shallow and deep copy operations
</title>
<div id='top-navigation-panel' xml:id='top-navigation-panel'
>
<table align=
"center" width=
"100%" cellpadding=
"0" cellspacing=
"2">
<td class='online-navigation'
><a rel=
"prev" title=
"3.17.2 Example"
href=
"node77.html"><img src='../icons/previous.png'
border='
0' height='
32' alt='Previous Page' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"parent" title=
"3. Python Runtime Services"
href=
"python.html"><img src='../icons/up.png'
border='
0' height='
32' alt='Up One Level' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"next" title=
"3.19 marshal "
href=
"module-marshal.html"><img src='../icons/next.png'
border='
0' height='
32' alt='Next Page' width='
32'
/></A></td>
<td align=
"center" width=
"100%">Python Library Reference
</td>
<td class='online-navigation'
><a rel=
"contents" title=
"Table of Contents"
href=
"contents.html"><img src='../icons/contents.png'
border='
0' height='
32' alt='Contents' width='
32'
/></A></td>
<td class='online-navigation'
><a href=
"modindex.html" title=
"Module Index"><img src='../icons/modules.png'
border='
0' height='
32' alt='Module Index' width='
32'
/></a></td>
<td class='online-navigation'
><a rel=
"index" title=
"Index"
href=
"genindex.html"><img src='../icons/index.png'
border='
0' height='
32' alt='Index' width='
32'
/></A></td>
<div class='online-navigation'
>
<b class=
"navlabel">Previous:
</b>
<a class=
"sectref" rel=
"prev" href=
"node77.html">3.17.2 Example
</A>
<b class=
"navlabel">Up:
</b>
<a class=
"sectref" rel=
"parent" href=
"python.html">3. Python Runtime Services
</A>
<b class=
"navlabel">Next:
</b>
<a class=
"sectref" rel=
"next" href=
"module-marshal.html">3.19 marshal
</A>
<!--End of Navigation Panel-->
<H1><A NAME=
"SECTION0051800000000000000000">
3.18 <tt class=
"module">copy
</tt> --
Shallow and deep copy operations
</A>
<A NAME=
"module-copy"></A>
This module provides generic (shallow and deep) copying operations.
<a id='l2h-
675' xml:id='l2h-
675'
></a>
<div class=
"verbatim"><pre>
x = copy.copy(y) # make a shallow copy of y
x = copy.deepcopy(y) # make a deep copy of y
For module specific errors,
<tt class=
"exception">copy.error
</tt> is raised.
The difference between shallow and deep copying is only relevant for
compound objects (objects that contain other objects, like lists or
<LI>A
<em>shallow copy
</em> constructs a new compound object and then (to the
extent possible) inserts
<em>references
</em> into it to the objects found
<LI>A
<em>deep copy
</em> constructs a new compound object and then,
recursively, inserts
<em>copies
</em> into it of the objects found in the
Two problems often exist with deep copy operations that don't exist
with shallow copy operations:
<LI>Recursive objects (compound objects that, directly or indirectly,
contain a reference to themselves) may cause a recursive loop.
<LI>Because deep copy copies
<em>everything
</em> it may copy too much,
e.g., administrative data structures that should be shared even
The
<tt class=
"function">deepcopy()
</tt> function avoids these problems by:
<LI>keeping a ``memo'' dictionary of objects already copied during the current
<LI>letting user-defined classes override the copying operation or the
set of components copied.
This version does not copy types like module, class, function, method,
stack trace, stack frame, file, socket, window, array, or any similar
Classes can use the same interfaces to control copying that they use
to control pickling. See the description of module
<tt class=
"module"><a href=
"module-pickle.html">pickle
</a></tt><a id='l2h-
678' xml:id='l2h-
678'
></a> for information on these
methods. The
<tt class=
"module">copy
</tt> module does not use the
<tt class=
"module"><a href=
"module-copyreg.html">copy_reg
</a></tt> registration module.
In order for a class to define its own copy implementation, it can
define special methods
<tt class=
"method">__copy__()
</tt> and
<tt class=
"method">__deepcopy__()
</tt>. 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
<tt class=
"method">__deepcopy__()
</tt>
implementation needs to make a deep copy of a component, it should
call the
<tt class=
"function">deepcopy()
</tt> function with the component as first
argument and the memo dictionary as second argument.
<a id='l2h-
677' xml:id='l2h-
677'
></a>
<p class=
"heading">See Also:
</p>
<dl compact=
"compact" class=
"seemodule">
<dt>Module
<b><tt class=
"module"><a href=
"module-pickle.html">pickle
</a></tt>:
</b>
<dd>Discussion of the special methods used to
support object state retrieval and restoration.
<div class='online-navigation'
>
<table align=
"center" width=
"100%" cellpadding=
"0" cellspacing=
"2">
<td class='online-navigation'
><a rel=
"prev" title=
"3.17.2 Example"
href=
"node77.html"><img src='../icons/previous.png'
border='
0' height='
32' alt='Previous Page' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"parent" title=
"3. Python Runtime Services"
href=
"python.html"><img src='../icons/up.png'
border='
0' height='
32' alt='Up One Level' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"next" title=
"3.19 marshal "
href=
"module-marshal.html"><img src='../icons/next.png'
border='
0' height='
32' alt='Next Page' width='
32'
/></A></td>
<td align=
"center" width=
"100%">Python Library Reference
</td>
<td class='online-navigation'
><a rel=
"contents" title=
"Table of Contents"
href=
"contents.html"><img src='../icons/contents.png'
border='
0' height='
32' alt='Contents' width='
32'
/></A></td>
<td class='online-navigation'
><a href=
"modindex.html" title=
"Module Index"><img src='../icons/modules.png'
border='
0' height='
32' alt='Module Index' width='
32'
/></a></td>
<td class='online-navigation'
><a rel=
"index" title=
"Index"
href=
"genindex.html"><img src='../icons/index.png'
border='
0' height='
32' alt='Index' width='
32'
/></A></td>
<div class='online-navigation'
>
<b class=
"navlabel">Previous:
</b>
<a class=
"sectref" rel=
"prev" href=
"node77.html">3.17.2 Example
</A>
<b class=
"navlabel">Up:
</b>
<a class=
"sectref" rel=
"parent" href=
"python.html">3. Python Runtime Services
</A>
<b class=
"navlabel">Next:
</b>
<a class=
"sectref" rel=
"next" href=
"module-marshal.html">3.19 marshal
</A>
<span class=
"release-info">Release
2.4.2, documentation updated on
28 September
2005.
</span>
<!--End of Navigation Panel-->
See
<i><a href=
"about.html">About this document...
</a></i> for information on suggesting changes.