blob: a4a3cebd530af77de413922641a712871cd2b05d [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 Rossum9c9cf412003-02-19 01:20:40 +000052from copy_reg import 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)
Guido van Rossume6908832003-02-19 01:19:28 +000082 if reductor:
83 rv = reductor(x)
84 else:
85 reductor = getattr(x, "__reduce_ex__", None)
86 if reductor:
87 rv = reductor(2)
88 else:
89 reductor = getattr(x, "__reduce__", None)
90 if reductor:
91 rv = reductor()
92 else:
93 raise Error("un(shallow)copyable object of type %s" % cls)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000094
Guido van Rossume6908832003-02-19 01:19:28 +000095 return _reconstruct(x, rv, 0)
Tim Petersf2715e02003-02-19 02:35:07 +000096
Guido van Rossumc7557582003-02-06 19:53:22 +000097
Guido van Rossum409780f1995-01-10 00:34:21 +000098_copy_dispatch = d = {}
99
100def _copy_atomic(x):
Tim Peters88869f92001-01-14 23:36:06 +0000101 return x
Guido van Rossum409780f1995-01-10 00:34:21 +0000102d[types.NoneType] = _copy_atomic
103d[types.IntType] = _copy_atomic
104d[types.LongType] = _copy_atomic
105d[types.FloatType] = _copy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000106d[types.BooleanType] = _copy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000107try:
108 d[types.ComplexType] = _copy_atomic
109except AttributeError:
110 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000111d[types.StringType] = _copy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000112try:
113 d[types.UnicodeType] = _copy_atomic
114except AttributeError:
115 pass
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000116try:
Tim Peters88869f92001-01-14 23:36:06 +0000117 d[types.CodeType] = _copy_atomic
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000118except AttributeError:
Tim Peters88869f92001-01-14 23:36:06 +0000119 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000120d[types.TypeType] = _copy_atomic
121d[types.XRangeType] = _copy_atomic
Guido van Rossum55d2f391995-03-14 17:41:36 +0000122d[types.ClassType] = _copy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000123
124def _copy_list(x):
Tim Peters88869f92001-01-14 23:36:06 +0000125 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000126d[types.ListType] = _copy_list
127
128def _copy_tuple(x):
Tim Peters88869f92001-01-14 23:36:06 +0000129 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000130d[types.TupleType] = _copy_tuple
131
132def _copy_dict(x):
Tim Peters88869f92001-01-14 23:36:06 +0000133 return x.copy()
Guido van Rossum409780f1995-01-10 00:34:21 +0000134d[types.DictionaryType] = _copy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000135if PyStringMap is not None:
136 d[PyStringMap] = _copy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000137
138def _copy_inst(x):
Tim Peters88869f92001-01-14 23:36:06 +0000139 if hasattr(x, '__copy__'):
140 return x.__copy__()
141 if hasattr(x, '__getinitargs__'):
142 args = x.__getinitargs__()
Guido van Rossum68468eb2003-02-27 20:14:51 +0000143 y = x.__class__(*args)
Tim Peters88869f92001-01-14 23:36:06 +0000144 else:
145 y = _EmptyClass()
146 y.__class__ = x.__class__
147 if hasattr(x, '__getstate__'):
148 state = x.__getstate__()
149 else:
150 state = x.__dict__
151 if hasattr(y, '__setstate__'):
152 y.__setstate__(state)
153 else:
154 y.__dict__.update(state)
155 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000156d[types.InstanceType] = _copy_inst
157
158del d
159
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000160def deepcopy(x, memo=None, _nil=[]):
Tim Peters88869f92001-01-14 23:36:06 +0000161 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000162
Tim Peters88869f92001-01-14 23:36:06 +0000163 See the module's __doc__ string for more info.
164 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000165
Tim Peters88869f92001-01-14 23:36:06 +0000166 if memo is None:
167 memo = {}
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000168
Tim Peters88869f92001-01-14 23:36:06 +0000169 d = id(x)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000170 y = memo.get(d, _nil)
171 if y is not _nil:
172 return y
173
174 cls = type(x)
175
176 copier = _deepcopy_dispatch.get(cls)
177 if copier:
178 y = copier(x, memo)
179 else:
Tim Peters88869f92001-01-14 23:36:06 +0000180 try:
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000181 issc = issubclass(cls, type)
182 except TypeError: # cls is not a class (old Boost; see SF #502085)
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000183 issc = 0
184 if issc:
Guido van Rossume6908832003-02-19 01:19:28 +0000185 y = _deepcopy_atomic(x, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000186 else:
Guido van Rossume6908832003-02-19 01:19:28 +0000187 copier = getattr(x, "__deepcopy__", None)
188 if copier:
189 y = copier(memo)
190 else:
191 reductor = dispatch_table.get(cls)
192 if reductor:
193 rv = reductor(x)
194 else:
195 reductor = getattr(x, "__reduce_ex__", None)
196 if reductor:
197 rv = reductor(2)
198 else:
199 reductor = getattr(x, "__reduce__", None)
200 if reductor:
201 rv = reductor()
202 else:
203 raise Error(
204 "un(deep)copyable object of type %s" % cls)
205 y = _reconstruct(x, rv, 1, memo)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000206
Tim Peters88869f92001-01-14 23:36:06 +0000207 memo[d] = y
Guido van Rossum61154602002-08-12 20:20:08 +0000208 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000209 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000210
211_deepcopy_dispatch = d = {}
212
213def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000214 return x
Guido van Rossum409780f1995-01-10 00:34:21 +0000215d[types.NoneType] = _deepcopy_atomic
216d[types.IntType] = _deepcopy_atomic
217d[types.LongType] = _deepcopy_atomic
218d[types.FloatType] = _deepcopy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000219d[types.BooleanType] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000220try:
221 d[types.ComplexType] = _deepcopy_atomic
222except AttributeError:
223 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000224d[types.StringType] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000225try:
226 d[types.UnicodeType] = _deepcopy_atomic
227except AttributeError:
228 pass
Guido van Rossum88b666c2002-02-28 23:19:52 +0000229try:
230 d[types.CodeType] = _deepcopy_atomic
231except AttributeError:
232 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000233d[types.TypeType] = _deepcopy_atomic
234d[types.XRangeType] = _deepcopy_atomic
Guido van Rossum1dca4822003-02-07 17:53:23 +0000235d[types.ClassType] = _deepcopy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000236
237def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000238 y = []
239 memo[id(x)] = y
240 for a in x:
241 y.append(deepcopy(a, memo))
242 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000243d[types.ListType] = _deepcopy_list
244
245def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000246 y = []
247 for a in x:
248 y.append(deepcopy(a, memo))
249 d = id(x)
250 try:
251 return memo[d]
252 except KeyError:
253 pass
254 for i in range(len(x)):
255 if x[i] is not y[i]:
256 y = tuple(y)
257 break
258 else:
259 y = x
260 memo[d] = y
261 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000262d[types.TupleType] = _deepcopy_tuple
263
264def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000265 y = {}
266 memo[id(x)] = y
Raymond Hettingere0d49722002-06-02 18:55:56 +0000267 for key, value in x.iteritems():
268 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000269 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000270d[types.DictionaryType] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000271if PyStringMap is not None:
272 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000273
Guido van Rossum558be281997-08-20 22:26:19 +0000274def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000275 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000276
Tim Peters88869f92001-01-14 23:36:06 +0000277 Because we remember objects by their id, we have
278 to assure that possibly temporary objects are kept
279 alive by referencing them.
280 We store a reference at the id of the memo, which should
281 normally not be used unless someone tries to deepcopy
282 the memo itself...
283 """
284 try:
285 memo[id(memo)].append(x)
286 except KeyError:
287 # aha, this is the first one :-)
288 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000289
Guido van Rossum409780f1995-01-10 00:34:21 +0000290def _deepcopy_inst(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000291 if hasattr(x, '__deepcopy__'):
292 return x.__deepcopy__(memo)
293 if hasattr(x, '__getinitargs__'):
294 args = x.__getinitargs__()
Tim Peters88869f92001-01-14 23:36:06 +0000295 args = deepcopy(args, memo)
Guido van Rossum68468eb2003-02-27 20:14:51 +0000296 y = x.__class__(*args)
Tim Peters88869f92001-01-14 23:36:06 +0000297 else:
298 y = _EmptyClass()
299 y.__class__ = x.__class__
300 memo[id(x)] = y
301 if hasattr(x, '__getstate__'):
302 state = x.__getstate__()
Tim Peters88869f92001-01-14 23:36:06 +0000303 else:
304 state = x.__dict__
305 state = deepcopy(state, memo)
306 if hasattr(y, '__setstate__'):
307 y.__setstate__(state)
308 else:
309 y.__dict__.update(state)
310 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000311d[types.InstanceType] = _deepcopy_inst
312
Guido van Rossum1e91c142001-12-28 21:33:22 +0000313def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000314 if isinstance(info, str):
315 return x
316 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000317 if memo is None:
318 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000319 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000320 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000321 callable, args = info[:2]
322 if n > 2:
323 state = info[2]
324 else:
325 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000326 if n > 3:
327 listiter = info[3]
328 else:
329 listiter = None
330 if n > 4:
331 dictiter = info[4]
332 else:
333 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000334 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000335 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000336 y = callable(*args)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000337 if listiter is not None:
338 for item in listiter:
339 if deep:
340 item = deepcopy(item, memo)
341 y.append(item)
342 if dictiter is not None:
343 for key, value in dictiter:
344 if deep:
345 key = deepcopy(key, memo)
346 value = deepcopy(value, memo)
347 y[key] = value
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000348 if state:
349 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000350 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000351 if hasattr(y, '__setstate__'):
352 y.__setstate__(state)
353 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000354 if isinstance(state, tuple) and len(state) == 2:
355 state, slotstate = state
356 else:
357 slotstate = None
358 if state is not None:
359 y.__dict__.update(state)
360 if slotstate is not None:
361 for key, value in slotstate.iteritems():
362 setattr(y, key, value)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000363 return y
364
Guido van Rossum409780f1995-01-10 00:34:21 +0000365del d
366
367del types
368
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000369# Helper for instance creation without calling __init__
370class _EmptyClass:
371 pass
372
Guido van Rossum409780f1995-01-10 00:34:21 +0000373def _test():
Tim Peters88869f92001-01-14 23:36:06 +0000374 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
375 {'abc': 'ABC'}, (), [], {}]
376 l1 = copy(l)
377 print l1==l
378 l1 = map(copy, l)
379 print l1==l
380 l1 = deepcopy(l)
381 print l1==l
382 class C:
383 def __init__(self, arg=None):
384 self.a = 1
385 self.arg = arg
386 if __name__ == '__main__':
387 import sys
388 file = sys.argv[0]
389 else:
390 file = __file__
391 self.fp = open(file)
392 self.fp.close()
393 def __getstate__(self):
394 return {'a': self.a, 'arg': self.arg}
395 def __setstate__(self, state):
Raymond Hettingere0d49722002-06-02 18:55:56 +0000396 for key, value in state.iteritems():
397 setattr(self, key, value)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000398 def __deepcopy__(self, memo=None):
Tim Peters88869f92001-01-14 23:36:06 +0000399 new = self.__class__(deepcopy(self.arg, memo))
400 new.a = self.a
401 return new
402 c = C('argument sketch')
403 l.append(c)
404 l2 = copy(l)
405 print l == l2
406 print l
407 print l2
408 l2 = deepcopy(l)
409 print l == l2
410 print l
411 print l2
412 l.append({l[1]: l, 'xyz': l[2]})
413 l3 = copy(l)
414 import repr
415 print map(repr.repr, l)
416 print map(repr.repr, l1)
417 print map(repr.repr, l2)
418 print map(repr.repr, l3)
419 l3 = deepcopy(l)
420 import repr
421 print map(repr.repr, l)
422 print map(repr.repr, l1)
423 print map(repr.repr, l2)
424 print map(repr.repr, l3)
Guido van Rossum409780f1995-01-10 00:34:21 +0000425
426if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000427 _test()