| 
									
										
										
										
											1998-08-10 19:42:37 +00:00
										 |  |  | \section{\module{copy} --- | 
					
						
							| 
									
										
										
										
											1999-02-12 20:40:49 +00:00
										 |  |  |          Shallow and deep copy operations} | 
					
						
							| 
									
										
										
										
											1998-07-23 17:59:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-29 16:02:12 +00:00
										 |  |  | \declaremodule{standard}{copy} | 
					
						
							| 
									
										
										
										
											1998-07-23 17:59:49 +00:00
										 |  |  | \modulesynopsis{Shallow and deep copy operations.} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-02-15 15:53:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | This module provides generic (shallow and deep) copying operations. | 
					
						
							| 
									
										
										
										
											1999-02-12 20:40:49 +00:00
										 |  |  | \withsubitem{(in copy)}{\ttindex{copy()}\ttindex{deepcopy()}} | 
					
						
							| 
									
										
										
										
											1995-02-15 15:53:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Interface summary: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-02-13 06:58:54 +00:00
										 |  |  | \begin{verbatim} | 
					
						
							| 
									
										
										
										
											1995-02-15 15:53:08 +00:00
										 |  |  | import copy | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-03-13 10:03:32 +00:00
										 |  |  | x = copy.copy(y)        # make a shallow copy of y | 
					
						
							|  |  |  | x = copy.deepcopy(y)    # make a deep copy of y | 
					
						
							| 
									
										
										
										
											1998-02-13 06:58:54 +00:00
										 |  |  | \end{verbatim} | 
					
						
							| 
									
										
										
										
											1997-07-17 16:34:52 +00:00
										 |  |  | %
 | 
					
						
							| 
									
										
										
										
											1998-11-30 18:59:44 +00:00
										 |  |  | For module specific errors, \exception{copy.error} is raised. | 
					
						
							| 
									
										
										
										
											1995-02-15 15:53:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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 | 
					
						
							| 
									
										
										
										
											1998-01-14 14:51:31 +00:00
										 |  |  | A \emph{shallow copy} constructs a new compound object and then (to the | 
					
						
							|  |  |  | extent possible) inserts \emph{references} into it to the objects found | 
					
						
							| 
									
										
										
										
											1995-02-15 15:53:08 +00:00
										 |  |  | in the original. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \item | 
					
						
							| 
									
										
										
										
											1998-01-14 14:51:31 +00:00
										 |  |  | A \emph{deep copy} constructs a new compound object and then, | 
					
						
							|  |  |  | recursively, inserts \emph{copies} into it of the objects found in the | 
					
						
							| 
									
										
										
										
											1995-02-15 15:53:08 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											1998-11-30 18:59:44 +00:00
										 |  |  | Because deep copy copies \emph{everything} it may copy too much, | 
					
						
							|  |  |  | e.g., administrative data structures that should be shared even | 
					
						
							|  |  |  | between copies. | 
					
						
							| 
									
										
										
										
											1995-02-15 15:53:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \end{itemize} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-11-30 18:59:44 +00:00
										 |  |  | The \function{deepcopy()} function avoids these problems by: | 
					
						
							| 
									
										
										
										
											1995-02-15 15:53:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{itemize} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \item | 
					
						
							| 
									
										
										
										
											1998-06-30 16:54:33 +00:00
										 |  |  | keeping a ``memo'' dictionary of objects already copied during the current | 
					
						
							| 
									
										
										
										
											1995-02-15 15:53:08 +00:00
										 |  |  | 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, | 
					
						
							| 
									
										
										
										
											1999-06-29 16:02:12 +00:00
										 |  |  | stack trace, stack frame, file, socket, window, array, or any similar | 
					
						
							|  |  |  | types. | 
					
						
							| 
									
										
										
										
											1995-02-15 15:53:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Classes can use the same interfaces to control copying that they use | 
					
						
							| 
									
										
										
										
											2004-05-05 04:24:30 +00:00
										 |  |  | to control pickling.  See the description of module | 
					
						
							| 
									
										
										
										
											1999-02-12 20:40:49 +00:00
										 |  |  | \refmodule{pickle}\refstmodindex{pickle} for information on these | 
					
						
							| 
									
										
										
										
											1999-06-29 16:02:12 +00:00
										 |  |  | methods.  The \module{copy} module does not use the | 
					
						
							|  |  |  | \refmodule[copyreg]{copy_reg} registration module. | 
					
						
							| 
									
										
										
										
											1998-06-30 16:54:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | In order for a class to define its own copy implementation, it can | 
					
						
							| 
									
										
										
										
											1998-11-30 18:59:44 +00:00
										 |  |  | 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. | 
					
						
							| 
									
										
										
										
											1999-02-12 20:40:49 +00:00
										 |  |  | \withsubitem{(copy protocol)}{\ttindex{__copy__()}\ttindex{__deepcopy__()}} | 
					
						
							| 
									
										
										
										
											1998-11-30 18:59:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{seealso} | 
					
						
							| 
									
										
										
										
											2000-10-06 20:16:50 +00:00
										 |  |  | \seemodule{pickle}{Discussion of the special methods used to | 
					
						
							| 
									
										
										
										
											1998-11-30 18:59:44 +00:00
										 |  |  | support object state retrieval and restoration.} | 
					
						
							|  |  |  | \end{seealso} |