blob: b57fa89710ae4b5804c6488c6f26a30c2dad079a [file] [log] [blame]
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +00001"""Generic (shallow and deep) copying operations.
Guido van Rossum409780f1995-01-10 00:34:21 +00002
Guido van Rossumcc6764c1995-02-09 17:18:10 +00003Interface summary:
4
Tim Peters88869f92001-01-14 23:36:06 +00005 import copy
Guido van Rossumcc6764c1995-02-09 17:18:10 +00006
Tim Peters88869f92001-01-14 23:36:06 +00007 x = copy.copy(y) # make a shallow copy of y
8 x = copy.deepcopy(y) # make a deep copy of y
Guido van Rossumcc6764c1995-02-09 17:18:10 +00009
Guido van Rossumc7557582003-02-06 19:53:22 +000010For module specific errors, copy.Error is raised.
Guido van Rossumcc6764c1995-02-09 17:18:10 +000011
12The difference between shallow and deep copying is only relevant for
13compound objects (objects that contain other objects, like lists or
14class instances).
15
16- A shallow copy constructs a new compound object and then (to the
17 extent possible) inserts *the same objects* into in that the
18 original contains.
19
20- A deep copy constructs a new compound object and then, recursively,
21 inserts *copies* into it of the objects found in the original.
22
23Two problems often exist with deep copy operations that don't exist
24with shallow copy operations:
25
Guido van Rossumf7cea101997-05-28 19:31:14 +000026 a) recursive objects (compound objects that, directly or indirectly,
Guido van Rossumcc6764c1995-02-09 17:18:10 +000027 contain a reference to themselves) may cause a recursive loop
28
Guido van Rossumf7cea101997-05-28 19:31:14 +000029 b) because deep copy copies *everything* it may copy too much, e.g.
Guido van Rossumcc6764c1995-02-09 17:18:10 +000030 administrative data structures that should be shared even between
31 copies
32
33Python's deep copy operation avoids these problems by:
34
Guido van Rossumf7cea101997-05-28 19:31:14 +000035 a) keeping a table of objects already copied during the current
36 copying pass
Guido van Rossumcc6764c1995-02-09 17:18:10 +000037
Guido van Rossumf7cea101997-05-28 19:31:14 +000038 b) letting user-defined classes override the copying operation or the
Guido van Rossumcc6764c1995-02-09 17:18:10 +000039 set of components copied
40
41This version does not copy types like module, class, function, method,
42nor stack trace, stack frame, nor file, socket, window, nor array, nor
43any similar types.
44
45Classes can use the same interfaces to control copying that they use
46to control pickling: they can define methods called __getinitargs__(),
Guido van Rossumc5d2d511997-12-07 16:18:22 +000047__getstate__() and __setstate__(). See the documentation for module
Guido van Rossumcc6764c1995-02-09 17:18:10 +000048"pickle" for information on these methods.
49"""
Guido van Rossum409780f1995-01-10 00:34:21 +000050
51import types
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000052from copy_reg import _better_reduce, dispatch_table
Guido van Rossum409780f1995-01-10 00:34:21 +000053
Fred Drake227b1202000-08-17 05:06:49 +000054class Error(Exception):
Tim Peters88869f92001-01-14 23:36:06 +000055 pass
56error = Error # backward compatibility
Guido van Rossum409780f1995-01-10 00:34:21 +000057
Guido van Rossumf8baad02000-11-27 21:53:14 +000058try:
59 from org.python.core import PyStringMap
60except ImportError:
61 PyStringMap = None
62
Guido van Rossumc7557582003-02-06 19:53:22 +000063__all__ = ["Error", "copy", "deepcopy"]
Skip Montanaroe99d5ea2001-01-20 19:54:20 +000064
Guido van Rossum409780f1995-01-10 00:34:21 +000065def copy(x):
Tim Peters88869f92001-01-14 23:36:06 +000066 """Shallow copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +000067
Tim Peters88869f92001-01-14 23:36:06 +000068 See the module's __doc__ string for more info.
69 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +000070
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000071 cls = type(x)
72
73 copier = _copy_dispatch.get(cls)
74 if copier:
75 return copier(x)
76
77 copier = getattr(cls, "__copy__", None)
78 if copier:
79 return copier(x)
80
81 reductor = dispatch_table.get(cls)
82 if not reductor:
83 reductor = getattr(cls, "__reduce__", None)
84 if reductor == object.__reduce__:
85 reductor = _better_reduce
86 elif not reductor:
87 raise Error("un(shallow)copyable object of type %s" % cls)
88
89 return _reconstruct(x, reductor(x), 0)
Guido van Rossumc7557582003-02-06 19:53:22 +000090
91
Guido van Rossum409780f1995-01-10 00:34:21 +000092_copy_dispatch = d = {}
93
94def _copy_atomic(x):
Tim Peters88869f92001-01-14 23:36:06 +000095 return x
Guido van Rossum409780f1995-01-10 00:34:21 +000096d[types.NoneType] = _copy_atomic
97d[types.IntType] = _copy_atomic
98d[types.LongType] = _copy_atomic
99d[types.FloatType] = _copy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000100d[types.BooleanType] = _copy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000101try:
102 d[types.ComplexType] = _copy_atomic
103except AttributeError:
104 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000105d[types.StringType] = _copy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000106try:
107 d[types.UnicodeType] = _copy_atomic
108except AttributeError:
109 pass
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000110try:
Tim Peters88869f92001-01-14 23:36:06 +0000111 d[types.CodeType] = _copy_atomic
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000112except AttributeError:
Tim Peters88869f92001-01-14 23:36:06 +0000113 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000114d[types.TypeType] = _copy_atomic
115d[types.XRangeType] = _copy_atomic
Guido van Rossum55d2f391995-03-14 17:41:36 +0000116d[types.ClassType] = _copy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000117
118def _copy_list(x):
Tim Peters88869f92001-01-14 23:36:06 +0000119 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000120d[types.ListType] = _copy_list
121
122def _copy_tuple(x):
Tim Peters88869f92001-01-14 23:36:06 +0000123 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000124d[types.TupleType] = _copy_tuple
125
126def _copy_dict(x):
Tim Peters88869f92001-01-14 23:36:06 +0000127 return x.copy()
Guido van Rossum409780f1995-01-10 00:34:21 +0000128d[types.DictionaryType] = _copy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000129if PyStringMap is not None:
130 d[PyStringMap] = _copy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000131
132def _copy_inst(x):
Tim Peters88869f92001-01-14 23:36:06 +0000133 if hasattr(x, '__copy__'):
134 return x.__copy__()
135 if hasattr(x, '__getinitargs__'):
136 args = x.__getinitargs__()
137 y = apply(x.__class__, args)
138 else:
139 y = _EmptyClass()
140 y.__class__ = x.__class__
141 if hasattr(x, '__getstate__'):
142 state = x.__getstate__()
143 else:
144 state = x.__dict__
145 if hasattr(y, '__setstate__'):
146 y.__setstate__(state)
147 else:
148 y.__dict__.update(state)
149 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000150d[types.InstanceType] = _copy_inst
151
152del d
153
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000154def deepcopy(x, memo=None, _nil=[]):
Tim Peters88869f92001-01-14 23:36:06 +0000155 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000156
Tim Peters88869f92001-01-14 23:36:06 +0000157 See the module's __doc__ string for more info.
158 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000159
Tim Peters88869f92001-01-14 23:36:06 +0000160 if memo is None:
161 memo = {}
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000162
Tim Peters88869f92001-01-14 23:36:06 +0000163 d = id(x)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000164 y = memo.get(d, _nil)
165 if y is not _nil:
166 return y
167
168 cls = type(x)
169
170 copier = _deepcopy_dispatch.get(cls)
171 if copier:
172 y = copier(x, memo)
173 else:
Tim Peters88869f92001-01-14 23:36:06 +0000174 try:
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000175 issc = issubclass(cls, type)
176 except TypeError: # cls is not a class (old Boost; see SF #502085)
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000177 issc = 0
178 if issc:
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000179 copier = _deepcopy_atomic
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000180 else:
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000181 copier = getattr(cls, "__deepcopy__", None)
182
183 if copier:
184 y = copier(x, memo)
185 else:
186 reductor = dispatch_table.get(cls)
187 if not reductor:
188 reductor = getattr(cls, "__reduce__", None)
189 if reductor == object.__reduce__:
190 reductor = _better_reduce
191 elif not reductor:
192 raise Error("un(deep)copyable object of type %s" % cls)
193 y = _reconstruct(x, reductor(x), 1, memo)
194
Tim Peters88869f92001-01-14 23:36:06 +0000195 memo[d] = y
Guido van Rossum61154602002-08-12 20:20:08 +0000196 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000197 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000198
199_deepcopy_dispatch = d = {}
200
201def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000202 return x
Guido van Rossum409780f1995-01-10 00:34:21 +0000203d[types.NoneType] = _deepcopy_atomic
204d[types.IntType] = _deepcopy_atomic
205d[types.LongType] = _deepcopy_atomic
206d[types.FloatType] = _deepcopy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000207d[types.BooleanType] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000208try:
209 d[types.ComplexType] = _deepcopy_atomic
210except AttributeError:
211 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000212d[types.StringType] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000213try:
214 d[types.UnicodeType] = _deepcopy_atomic
215except AttributeError:
216 pass
Guido van Rossum88b666c2002-02-28 23:19:52 +0000217try:
218 d[types.CodeType] = _deepcopy_atomic
219except AttributeError:
220 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000221d[types.TypeType] = _deepcopy_atomic
222d[types.XRangeType] = _deepcopy_atomic
Guido van Rossum1dca4822003-02-07 17:53:23 +0000223d[types.ClassType] = _deepcopy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000224
225def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000226 y = []
227 memo[id(x)] = y
228 for a in x:
229 y.append(deepcopy(a, memo))
230 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000231d[types.ListType] = _deepcopy_list
232
233def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000234 y = []
235 for a in x:
236 y.append(deepcopy(a, memo))
237 d = id(x)
238 try:
239 return memo[d]
240 except KeyError:
241 pass
242 for i in range(len(x)):
243 if x[i] is not y[i]:
244 y = tuple(y)
245 break
246 else:
247 y = x
248 memo[d] = y
249 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000250d[types.TupleType] = _deepcopy_tuple
251
252def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000253 y = {}
254 memo[id(x)] = y
Raymond Hettingere0d49722002-06-02 18:55:56 +0000255 for key, value in x.iteritems():
256 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000257 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000258d[types.DictionaryType] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000259if PyStringMap is not None:
260 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000261
Guido van Rossum558be281997-08-20 22:26:19 +0000262def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000263 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000264
Tim Peters88869f92001-01-14 23:36:06 +0000265 Because we remember objects by their id, we have
266 to assure that possibly temporary objects are kept
267 alive by referencing them.
268 We store a reference at the id of the memo, which should
269 normally not be used unless someone tries to deepcopy
270 the memo itself...
271 """
272 try:
273 memo[id(memo)].append(x)
274 except KeyError:
275 # aha, this is the first one :-)
276 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000277
Guido van Rossum409780f1995-01-10 00:34:21 +0000278def _deepcopy_inst(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000279 if hasattr(x, '__deepcopy__'):
280 return x.__deepcopy__(memo)
281 if hasattr(x, '__getinitargs__'):
282 args = x.__getinitargs__()
Tim Peters88869f92001-01-14 23:36:06 +0000283 args = deepcopy(args, memo)
284 y = apply(x.__class__, args)
285 else:
286 y = _EmptyClass()
287 y.__class__ = x.__class__
288 memo[id(x)] = y
289 if hasattr(x, '__getstate__'):
290 state = x.__getstate__()
Tim Peters88869f92001-01-14 23:36:06 +0000291 else:
292 state = x.__dict__
293 state = deepcopy(state, memo)
294 if hasattr(y, '__setstate__'):
295 y.__setstate__(state)
296 else:
297 y.__dict__.update(state)
298 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000299d[types.InstanceType] = _deepcopy_inst
300
Guido van Rossum1e91c142001-12-28 21:33:22 +0000301def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000302 if isinstance(info, str):
303 return x
304 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000305 if memo is None:
306 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000307 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000308 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000309 callable, args = info[:2]
310 if n > 2:
311 state = info[2]
312 else:
313 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000314 if n > 3:
315 listiter = info[3]
316 else:
317 listiter = None
318 if n > 4:
319 dictiter = info[4]
320 else:
321 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000322 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000323 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000324 y = callable(*args)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000325 if listiter is not None:
326 for item in listiter:
327 if deep:
328 item = deepcopy(item, memo)
329 y.append(item)
330 if dictiter is not None:
331 for key, value in dictiter:
332 if deep:
333 key = deepcopy(key, memo)
334 value = deepcopy(value, memo)
335 y[key] = value
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000336 if state:
337 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000338 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000339 if hasattr(y, '__setstate__'):
340 y.__setstate__(state)
341 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000342 if isinstance(state, tuple) and len(state) == 2:
343 state, slotstate = state
344 else:
345 slotstate = None
346 if state is not None:
347 y.__dict__.update(state)
348 if slotstate is not None:
349 for key, value in slotstate.iteritems():
350 setattr(y, key, value)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000351 return y
352
Guido van Rossum409780f1995-01-10 00:34:21 +0000353del d
354
355del types
356
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000357# Helper for instance creation without calling __init__
358class _EmptyClass:
359 pass
360
Guido van Rossum409780f1995-01-10 00:34:21 +0000361def _test():
Tim Peters88869f92001-01-14 23:36:06 +0000362 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
363 {'abc': 'ABC'}, (), [], {}]
364 l1 = copy(l)
365 print l1==l
366 l1 = map(copy, l)
367 print l1==l
368 l1 = deepcopy(l)
369 print l1==l
370 class C:
371 def __init__(self, arg=None):
372 self.a = 1
373 self.arg = arg
374 if __name__ == '__main__':
375 import sys
376 file = sys.argv[0]
377 else:
378 file = __file__
379 self.fp = open(file)
380 self.fp.close()
381 def __getstate__(self):
382 return {'a': self.a, 'arg': self.arg}
383 def __setstate__(self, state):
Raymond Hettingere0d49722002-06-02 18:55:56 +0000384 for key, value in state.iteritems():
385 setattr(self, key, value)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000386 def __deepcopy__(self, memo=None):
Tim Peters88869f92001-01-14 23:36:06 +0000387 new = self.__class__(deepcopy(self.arg, memo))
388 new.a = self.a
389 return new
390 c = C('argument sketch')
391 l.append(c)
392 l2 = copy(l)
393 print l == l2
394 print l
395 print l2
396 l2 = deepcopy(l)
397 print l == l2
398 print l
399 print l2
400 l.append({l[1]: l, 'xyz': l[2]})
401 l3 = copy(l)
402 import repr
403 print map(repr.repr, l)
404 print map(repr.repr, l1)
405 print map(repr.repr, l2)
406 print map(repr.repr, l3)
407 l3 = deepcopy(l)
408 import repr
409 print map(repr.repr, l)
410 print map(repr.repr, l1)
411 print map(repr.repr, l2)
412 print map(repr.repr, l3)
Guido van Rossum409780f1995-01-10 00:34:21 +0000413
414if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000415 _test()