blob: 3f2033f5ffd104cf3bcff9db46179923b5c862da [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
Raymond Hettingerf9d88ab2005-06-13 01:10:15 +000017 extent possible) inserts *the same objects* into it that the
Guido van Rossumcc6764c1995-02-09 17:18:10 +000018 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
Georg Brandldffbf5f2008-05-20 07:49:57 +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
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000100def _copy_immutable(x):
Tim Peters88869f92001-01-14 23:36:06 +0000101 return x
Raymond Hettingerf7153662005-02-07 14:16:21 +0000102for t in (type(None), int, long, float, bool, str, tuple,
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000103 frozenset, type, xrange, types.ClassType,
Raymond Hettingerb72233c2008-03-24 08:17:39 +0000104 types.BuiltinFunctionType, type(Ellipsis),
Tim Petersd6e7e732006-02-26 04:21:50 +0000105 types.FunctionType):
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000106 d[t] = _copy_immutable
107for name in ("ComplexType", "UnicodeType", "CodeType"):
108 t = getattr(types, name, None)
109 if t is not None:
110 d[t] = _copy_immutable
Guido van Rossum409780f1995-01-10 00:34:21 +0000111
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000112def _copy_with_constructor(x):
113 return type(x)(x)
114for t in (list, dict, set):
115 d[t] = _copy_with_constructor
Guido van Rossum409780f1995-01-10 00:34:21 +0000116
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000117def _copy_with_copy_method(x):
Tim Peters88869f92001-01-14 23:36:06 +0000118 return x.copy()
Guido van Rossumf8baad02000-11-27 21:53:14 +0000119if PyStringMap is not None:
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000120 d[PyStringMap] = _copy_with_copy_method
Guido van Rossum409780f1995-01-10 00:34:21 +0000121
122def _copy_inst(x):
Tim Peters88869f92001-01-14 23:36:06 +0000123 if hasattr(x, '__copy__'):
124 return x.__copy__()
125 if hasattr(x, '__getinitargs__'):
126 args = x.__getinitargs__()
Guido van Rossum68468eb2003-02-27 20:14:51 +0000127 y = x.__class__(*args)
Tim Peters88869f92001-01-14 23:36:06 +0000128 else:
129 y = _EmptyClass()
130 y.__class__ = x.__class__
131 if hasattr(x, '__getstate__'):
132 state = x.__getstate__()
133 else:
134 state = x.__dict__
135 if hasattr(y, '__setstate__'):
136 y.__setstate__(state)
137 else:
138 y.__dict__.update(state)
139 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000140d[types.InstanceType] = _copy_inst
141
142del d
143
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000144def deepcopy(x, memo=None, _nil=[]):
Tim Peters88869f92001-01-14 23:36:06 +0000145 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000146
Tim Peters88869f92001-01-14 23:36:06 +0000147 See the module's __doc__ string for more info.
148 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000149
Tim Peters88869f92001-01-14 23:36:06 +0000150 if memo is None:
151 memo = {}
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000152
Tim Peters88869f92001-01-14 23:36:06 +0000153 d = id(x)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000154 y = memo.get(d, _nil)
155 if y is not _nil:
156 return y
157
158 cls = type(x)
159
160 copier = _deepcopy_dispatch.get(cls)
161 if copier:
162 y = copier(x, memo)
163 else:
Tim Peters88869f92001-01-14 23:36:06 +0000164 try:
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000165 issc = issubclass(cls, type)
166 except TypeError: # cls is not a class (old Boost; see SF #502085)
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000167 issc = 0
168 if issc:
Guido van Rossume6908832003-02-19 01:19:28 +0000169 y = _deepcopy_atomic(x, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000170 else:
Guido van Rossume6908832003-02-19 01:19:28 +0000171 copier = getattr(x, "__deepcopy__", None)
172 if copier:
173 y = copier(memo)
174 else:
175 reductor = dispatch_table.get(cls)
176 if reductor:
177 rv = reductor(x)
178 else:
179 reductor = getattr(x, "__reduce_ex__", None)
180 if reductor:
181 rv = reductor(2)
182 else:
183 reductor = getattr(x, "__reduce__", None)
184 if reductor:
185 rv = reductor()
186 else:
187 raise Error(
188 "un(deep)copyable object of type %s" % cls)
189 y = _reconstruct(x, rv, 1, memo)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000190
Tim Peters88869f92001-01-14 23:36:06 +0000191 memo[d] = y
Guido van Rossum61154602002-08-12 20:20:08 +0000192 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000193 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000194
195_deepcopy_dispatch = d = {}
196
197def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000198 return x
Raymond Hettingerf7153662005-02-07 14:16:21 +0000199d[type(None)] = _deepcopy_atomic
Raymond Hettingerb72233c2008-03-24 08:17:39 +0000200d[type(Ellipsis)] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000201d[int] = _deepcopy_atomic
202d[long] = _deepcopy_atomic
203d[float] = _deepcopy_atomic
204d[bool] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000205try:
Raymond Hettingerf7153662005-02-07 14:16:21 +0000206 d[complex] = _deepcopy_atomic
Martin v. Löwise2713be2005-03-08 15:03:08 +0000207except NameError:
Guido van Rossum8b9def32001-09-28 18:16:13 +0000208 pass
Raymond Hettingerf7153662005-02-07 14:16:21 +0000209d[str] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000210try:
Raymond Hettingerf7153662005-02-07 14:16:21 +0000211 d[unicode] = _deepcopy_atomic
Martin v. Löwise2713be2005-03-08 15:03:08 +0000212except NameError:
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000213 pass
Guido van Rossum88b666c2002-02-28 23:19:52 +0000214try:
215 d[types.CodeType] = _deepcopy_atomic
216except AttributeError:
217 pass
Raymond Hettingerf7153662005-02-07 14:16:21 +0000218d[type] = _deepcopy_atomic
219d[xrange] = _deepcopy_atomic
Guido van Rossum1dca4822003-02-07 17:53:23 +0000220d[types.ClassType] = _deepcopy_atomic
Martin v. Löwisba8f5ff2003-06-14 07:10:06 +0000221d[types.BuiltinFunctionType] = _deepcopy_atomic
Guido van Rossum1968ad32006-02-25 22:38:04 +0000222d[types.FunctionType] = _deepcopy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000223
224def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000225 y = []
226 memo[id(x)] = y
227 for a in x:
228 y.append(deepcopy(a, memo))
229 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000230d[list] = _deepcopy_list
Guido van Rossum409780f1995-01-10 00:34:21 +0000231
232def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000233 y = []
234 for a in x:
235 y.append(deepcopy(a, memo))
236 d = id(x)
237 try:
238 return memo[d]
239 except KeyError:
240 pass
241 for i in range(len(x)):
242 if x[i] is not y[i]:
243 y = tuple(y)
244 break
245 else:
246 y = x
247 memo[d] = y
248 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000249d[tuple] = _deepcopy_tuple
Guido van Rossum409780f1995-01-10 00:34:21 +0000250
251def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000252 y = {}
253 memo[id(x)] = y
Raymond Hettingere0d49722002-06-02 18:55:56 +0000254 for key, value in x.iteritems():
255 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000256 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000257d[dict] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000258if PyStringMap is not None:
259 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000260
Guido van Rossum558be281997-08-20 22:26:19 +0000261def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000262 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000263
Tim Peters88869f92001-01-14 23:36:06 +0000264 Because we remember objects by their id, we have
265 to assure that possibly temporary objects are kept
266 alive by referencing them.
267 We store a reference at the id of the memo, which should
268 normally not be used unless someone tries to deepcopy
269 the memo itself...
270 """
271 try:
272 memo[id(memo)].append(x)
273 except KeyError:
274 # aha, this is the first one :-)
275 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000276
Guido van Rossum409780f1995-01-10 00:34:21 +0000277def _deepcopy_inst(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000278 if hasattr(x, '__deepcopy__'):
279 return x.__deepcopy__(memo)
280 if hasattr(x, '__getinitargs__'):
281 args = x.__getinitargs__()
Tim Peters88869f92001-01-14 23:36:06 +0000282 args = deepcopy(args, memo)
Guido van Rossum68468eb2003-02-27 20:14:51 +0000283 y = x.__class__(*args)
Tim Peters88869f92001-01-14 23:36:06 +0000284 else:
285 y = _EmptyClass()
286 y.__class__ = x.__class__
287 memo[id(x)] = y
288 if hasattr(x, '__getstate__'):
289 state = x.__getstate__()
Tim Peters88869f92001-01-14 23:36:06 +0000290 else:
291 state = x.__dict__
292 state = deepcopy(state, memo)
293 if hasattr(y, '__setstate__'):
294 y.__setstate__(state)
295 else:
296 y.__dict__.update(state)
297 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000298d[types.InstanceType] = _deepcopy_inst
299
Guido van Rossum1e91c142001-12-28 21:33:22 +0000300def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000301 if isinstance(info, str):
302 return x
303 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000304 if memo is None:
305 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000306 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000307 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000308 callable, args = info[:2]
309 if n > 2:
310 state = info[2]
311 else:
312 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000313 if n > 3:
314 listiter = info[3]
315 else:
316 listiter = None
317 if n > 4:
318 dictiter = info[4]
319 else:
320 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000321 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000322 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000323 y = callable(*args)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000324 memo[id(x)] = y
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)
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000402 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)
Tim Peters88869f92001-01-14 23:36:06 +0000407 l3 = deepcopy(l)
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000408 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()