blob: 4b755112d7958cfb873c0e4055a575da5666c681 [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
Antoine Pitrou6e610062009-05-15 17:04:50 +000052import weakref
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000053from copyreg import dispatch_table
Antoine Pitrouce111ca2010-09-04 17:49:13 +000054import builtins
Guido van Rossum409780f1995-01-10 00:34:21 +000055
Fred Drake227b1202000-08-17 05:06:49 +000056class Error(Exception):
Tim Peters88869f92001-01-14 23:36:06 +000057 pass
58error = Error # backward compatibility
Guido van Rossum409780f1995-01-10 00:34:21 +000059
Guido van Rossumf8baad02000-11-27 21:53:14 +000060try:
61 from org.python.core import PyStringMap
62except ImportError:
63 PyStringMap = None
64
Guido van Rossumc7557582003-02-06 19:53:22 +000065__all__ = ["Error", "copy", "deepcopy"]
Skip Montanaroe99d5ea2001-01-20 19:54:20 +000066
Guido van Rossum409780f1995-01-10 00:34:21 +000067def copy(x):
Tim Peters88869f92001-01-14 23:36:06 +000068 """Shallow copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +000069
Tim Peters88869f92001-01-14 23:36:06 +000070 See the module's __doc__ string for more info.
71 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +000072
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000073 cls = type(x)
74
75 copier = _copy_dispatch.get(cls)
76 if copier:
77 return copier(x)
78
79 copier = getattr(cls, "__copy__", None)
80 if copier:
81 return copier(x)
82
83 reductor = dispatch_table.get(cls)
Guido van Rossume6908832003-02-19 01:19:28 +000084 if reductor:
85 rv = reductor(x)
86 else:
87 reductor = getattr(x, "__reduce_ex__", None)
88 if reductor:
89 rv = reductor(2)
90 else:
91 reductor = getattr(x, "__reduce__", None)
92 if reductor:
93 rv = reductor()
94 else:
95 raise Error("un(shallow)copyable object of type %s" % cls)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000096
Guido van Rossume6908832003-02-19 01:19:28 +000097 return _reconstruct(x, rv, 0)
Tim Petersf2715e02003-02-19 02:35:07 +000098
Guido van Rossumc7557582003-02-06 19:53:22 +000099
Guido van Rossum409780f1995-01-10 00:34:21 +0000100_copy_dispatch = d = {}
101
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000102def _copy_immutable(x):
Tim Peters88869f92001-01-14 23:36:06 +0000103 return x
Neal Norwitzb69b2e52007-02-27 03:41:04 +0000104for t in (type(None), int, float, bool, str, tuple,
Guido van Rossum13257902007-06-07 23:15:56 +0000105 frozenset, type, range,
Christian Heimescc47b052008-03-25 14:56:36 +0000106 types.BuiltinFunctionType, type(Ellipsis),
Antoine Pitrou6e610062009-05-15 17:04:50 +0000107 types.FunctionType, weakref.ref):
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000108 d[t] = _copy_immutable
Guido van Rossum13257902007-06-07 23:15:56 +0000109t = getattr(types, "CodeType", None)
110if t is not None:
111 d[t] = _copy_immutable
112for name in ("complex", "unicode"):
Antoine Pitrouce111ca2010-09-04 17:49:13 +0000113 t = getattr(builtins, name, None)
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000114 if t is not None:
115 d[t] = _copy_immutable
Guido van Rossum409780f1995-01-10 00:34:21 +0000116
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000117def _copy_with_constructor(x):
118 return type(x)(x)
119for t in (list, dict, set):
120 d[t] = _copy_with_constructor
Guido van Rossum409780f1995-01-10 00:34:21 +0000121
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000122def _copy_with_copy_method(x):
Tim Peters88869f92001-01-14 23:36:06 +0000123 return x.copy()
Guido van Rossumf8baad02000-11-27 21:53:14 +0000124if PyStringMap is not None:
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000125 d[PyStringMap] = _copy_with_copy_method
Guido van Rossum409780f1995-01-10 00:34:21 +0000126
Guido van Rossum409780f1995-01-10 00:34:21 +0000127del d
128
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000129def deepcopy(x, memo=None, _nil=[]):
Tim Peters88869f92001-01-14 23:36:06 +0000130 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000131
Tim Peters88869f92001-01-14 23:36:06 +0000132 See the module's __doc__ string for more info.
133 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000134
Tim Peters88869f92001-01-14 23:36:06 +0000135 if memo is None:
136 memo = {}
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000137
Tim Peters88869f92001-01-14 23:36:06 +0000138 d = id(x)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000139 y = memo.get(d, _nil)
140 if y is not _nil:
141 return y
142
143 cls = type(x)
144
145 copier = _deepcopy_dispatch.get(cls)
146 if copier:
147 y = copier(x, memo)
148 else:
Tim Peters88869f92001-01-14 23:36:06 +0000149 try:
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000150 issc = issubclass(cls, type)
151 except TypeError: # cls is not a class (old Boost; see SF #502085)
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000152 issc = 0
153 if issc:
Guido van Rossume6908832003-02-19 01:19:28 +0000154 y = _deepcopy_atomic(x, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000155 else:
Guido van Rossume6908832003-02-19 01:19:28 +0000156 copier = getattr(x, "__deepcopy__", None)
157 if copier:
158 y = copier(memo)
159 else:
160 reductor = dispatch_table.get(cls)
161 if reductor:
162 rv = reductor(x)
163 else:
164 reductor = getattr(x, "__reduce_ex__", None)
165 if reductor:
166 rv = reductor(2)
167 else:
168 reductor = getattr(x, "__reduce__", None)
169 if reductor:
170 rv = reductor()
171 else:
172 raise Error(
173 "un(deep)copyable object of type %s" % cls)
174 y = _reconstruct(x, rv, 1, memo)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000175
Tim Peters88869f92001-01-14 23:36:06 +0000176 memo[d] = y
Guido van Rossum61154602002-08-12 20:20:08 +0000177 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000178 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000179
180_deepcopy_dispatch = d = {}
181
182def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000183 return x
Raymond Hettingerf7153662005-02-07 14:16:21 +0000184d[type(None)] = _deepcopy_atomic
Christian Heimescc47b052008-03-25 14:56:36 +0000185d[type(Ellipsis)] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000186d[int] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000187d[float] = _deepcopy_atomic
188d[bool] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000189try:
Raymond Hettingerf7153662005-02-07 14:16:21 +0000190 d[complex] = _deepcopy_atomic
Martin v. Löwise2713be2005-03-08 15:03:08 +0000191except NameError:
Guido van Rossum8b9def32001-09-28 18:16:13 +0000192 pass
Guido van Rossum98297ee2007-11-06 21:34:58 +0000193d[bytes] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000194d[str] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000195try:
Guido van Rossum88b666c2002-02-28 23:19:52 +0000196 d[types.CodeType] = _deepcopy_atomic
197except AttributeError:
198 pass
Raymond Hettingerf7153662005-02-07 14:16:21 +0000199d[type] = _deepcopy_atomic
Guido van Rossum805365e2007-05-07 22:24:25 +0000200d[range] = _deepcopy_atomic
Martin v. Löwisba8f5ff2003-06-14 07:10:06 +0000201d[types.BuiltinFunctionType] = _deepcopy_atomic
Guido van Rossum1968ad32006-02-25 22:38:04 +0000202d[types.FunctionType] = _deepcopy_atomic
Antoine Pitrou6e610062009-05-15 17:04:50 +0000203d[weakref.ref] = _deepcopy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000204
205def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000206 y = []
207 memo[id(x)] = y
208 for a in x:
209 y.append(deepcopy(a, memo))
210 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000211d[list] = _deepcopy_list
Guido van Rossum409780f1995-01-10 00:34:21 +0000212
213def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000214 y = []
215 for a in x:
216 y.append(deepcopy(a, memo))
217 d = id(x)
218 try:
219 return memo[d]
220 except KeyError:
221 pass
222 for i in range(len(x)):
223 if x[i] is not y[i]:
224 y = tuple(y)
225 break
226 else:
227 y = x
228 memo[d] = y
229 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000230d[tuple] = _deepcopy_tuple
Guido van Rossum409780f1995-01-10 00:34:21 +0000231
232def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000233 y = {}
234 memo[id(x)] = y
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000235 for key, value in x.items():
Raymond Hettingere0d49722002-06-02 18:55:56 +0000236 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000237 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000238d[dict] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000239if PyStringMap is not None:
240 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000241
Guido van Rossum558be281997-08-20 22:26:19 +0000242def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000243 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000244
Tim Peters88869f92001-01-14 23:36:06 +0000245 Because we remember objects by their id, we have
246 to assure that possibly temporary objects are kept
247 alive by referencing them.
248 We store a reference at the id of the memo, which should
249 normally not be used unless someone tries to deepcopy
250 the memo itself...
251 """
252 try:
253 memo[id(memo)].append(x)
254 except KeyError:
255 # aha, this is the first one :-)
256 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000257
Guido van Rossum1e91c142001-12-28 21:33:22 +0000258def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000259 if isinstance(info, str):
260 return x
261 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000262 if memo is None:
263 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000264 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000265 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000266 callable, args = info[:2]
267 if n > 2:
268 state = info[2]
269 else:
270 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000271 if n > 3:
272 listiter = info[3]
273 else:
274 listiter = None
275 if n > 4:
276 dictiter = info[4]
277 else:
278 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000279 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000280 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000281 y = callable(*args)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000282 memo[id(x)] = y
Antoine Pitrouce111ca2010-09-04 17:49:13 +0000283
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000284 if state:
285 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000286 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000287 if hasattr(y, '__setstate__'):
288 y.__setstate__(state)
289 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000290 if isinstance(state, tuple) and len(state) == 2:
291 state, slotstate = state
292 else:
293 slotstate = None
294 if state is not None:
295 y.__dict__.update(state)
296 if slotstate is not None:
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000297 for key, value in slotstate.items():
Guido van Rossumc7557582003-02-06 19:53:22 +0000298 setattr(y, key, value)
Antoine Pitrouce111ca2010-09-04 17:49:13 +0000299
300 if listiter is not None:
301 for item in listiter:
302 if deep:
303 item = deepcopy(item, memo)
304 y.append(item)
305 if dictiter is not None:
306 for key, value in dictiter:
307 if deep:
308 key = deepcopy(key, memo)
309 value = deepcopy(value, memo)
310 y[key] = value
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000311 return y
312
Guido van Rossum409780f1995-01-10 00:34:21 +0000313del d
314
315del types
316
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000317# Helper for instance creation without calling __init__
318class _EmptyClass:
319 pass
320
Guido van Rossum409780f1995-01-10 00:34:21 +0000321def _test():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000322 l = [None, 1, 2, 3.14, 'xyzzy', (1, 2), [3.14, 'abc'],
Tim Peters88869f92001-01-14 23:36:06 +0000323 {'abc': 'ABC'}, (), [], {}]
324 l1 = copy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000325 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000326 l1 = map(copy, l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000327 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000328 l1 = deepcopy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000329 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000330 class C:
331 def __init__(self, arg=None):
332 self.a = 1
333 self.arg = arg
334 if __name__ == '__main__':
335 import sys
336 file = sys.argv[0]
337 else:
338 file = __file__
339 self.fp = open(file)
340 self.fp.close()
341 def __getstate__(self):
342 return {'a': self.a, 'arg': self.arg}
343 def __setstate__(self, state):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000344 for key, value in state.items():
Raymond Hettingere0d49722002-06-02 18:55:56 +0000345 setattr(self, key, value)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000346 def __deepcopy__(self, memo=None):
Tim Peters88869f92001-01-14 23:36:06 +0000347 new = self.__class__(deepcopy(self.arg, memo))
348 new.a = self.a
349 return new
350 c = C('argument sketch')
351 l.append(c)
352 l2 = copy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000353 print(l == l2)
354 print(l)
355 print(l2)
Tim Peters88869f92001-01-14 23:36:06 +0000356 l2 = deepcopy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000357 print(l == l2)
358 print(l)
359 print(l2)
Tim Peters88869f92001-01-14 23:36:06 +0000360 l.append({l[1]: l, 'xyz': l[2]})
361 l3 = copy(l)
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000362 import reprlib
363 print(map(reprlib.repr, l))
364 print(map(reprlib.repr, l1))
365 print(map(reprlib.repr, l2))
366 print(map(reprlib.repr, l3))
Tim Peters88869f92001-01-14 23:36:06 +0000367 l3 = deepcopy(l)
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000368 print(map(reprlib.repr, l))
369 print(map(reprlib.repr, l1))
370 print(map(reprlib.repr, l2))
371 print(map(reprlib.repr, l3))
Antoine Pitrouce111ca2010-09-04 17:49:13 +0000372 class odict(dict):
373 def __init__(self, d = {}):
374 self.a = 99
375 dict.__init__(self, d)
376 def __setitem__(self, k, i):
377 dict.__setitem__(self, k, i)
378 self.a
379 o = odict({"A" : "B"})
380 x = deepcopy(o)
381 print(o, x)
Guido van Rossum409780f1995-01-10 00:34:21 +0000382
383if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000384 _test()