blob: 497f21fbc79e307d86aa4c6aee3cef145eb39c5b [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 Pitroud6399d22010-09-04 17:46:44 +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 Pitroud6399d22010-09-04 17:46:44 +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
Benjamin Petersone90ec362011-06-27 16:22:46 -0500176 # If is its own copy, don't memoize.
177 if y is not x:
178 memo[d] = y
179 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000180 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000181
182_deepcopy_dispatch = d = {}
183
184def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000185 return x
Raymond Hettingerf7153662005-02-07 14:16:21 +0000186d[type(None)] = _deepcopy_atomic
Christian Heimescc47b052008-03-25 14:56:36 +0000187d[type(Ellipsis)] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000188d[int] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000189d[float] = _deepcopy_atomic
190d[bool] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000191try:
Raymond Hettingerf7153662005-02-07 14:16:21 +0000192 d[complex] = _deepcopy_atomic
Martin v. Löwise2713be2005-03-08 15:03:08 +0000193except NameError:
Guido van Rossum8b9def32001-09-28 18:16:13 +0000194 pass
Guido van Rossum98297ee2007-11-06 21:34:58 +0000195d[bytes] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000196d[str] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000197try:
Guido van Rossum88b666c2002-02-28 23:19:52 +0000198 d[types.CodeType] = _deepcopy_atomic
199except AttributeError:
200 pass
Raymond Hettingerf7153662005-02-07 14:16:21 +0000201d[type] = _deepcopy_atomic
Guido van Rossum805365e2007-05-07 22:24:25 +0000202d[range] = _deepcopy_atomic
Martin v. Löwisba8f5ff2003-06-14 07:10:06 +0000203d[types.BuiltinFunctionType] = _deepcopy_atomic
Guido van Rossum1968ad32006-02-25 22:38:04 +0000204d[types.FunctionType] = _deepcopy_atomic
Antoine Pitrou6e610062009-05-15 17:04:50 +0000205d[weakref.ref] = _deepcopy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000206
207def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000208 y = []
209 memo[id(x)] = y
210 for a in x:
211 y.append(deepcopy(a, memo))
212 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000213d[list] = _deepcopy_list
Guido van Rossum409780f1995-01-10 00:34:21 +0000214
215def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000216 y = []
217 for a in x:
218 y.append(deepcopy(a, memo))
Benjamin Petersone90ec362011-06-27 16:22:46 -0500219 # We're not going to put the tuple in the memo, but it's still important we
220 # check for it, in case the tuple contains recursive mutable structures.
Tim Peters88869f92001-01-14 23:36:06 +0000221 try:
Benjamin Petersone90ec362011-06-27 16:22:46 -0500222 return memo[id(x)]
Tim Peters88869f92001-01-14 23:36:06 +0000223 except KeyError:
224 pass
225 for i in range(len(x)):
226 if x[i] is not y[i]:
227 y = tuple(y)
228 break
229 else:
230 y = x
Tim Peters88869f92001-01-14 23:36:06 +0000231 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000232d[tuple] = _deepcopy_tuple
Guido van Rossum409780f1995-01-10 00:34:21 +0000233
234def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000235 y = {}
236 memo[id(x)] = y
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000237 for key, value in x.items():
Raymond Hettingere0d49722002-06-02 18:55:56 +0000238 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000239 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000240d[dict] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000241if PyStringMap is not None:
242 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000243
Antoine Pitrou1fc0d2b2009-11-28 15:58:27 +0000244def _deepcopy_method(x, memo): # Copy instance methods
245 return type(x)(x.__func__, deepcopy(x.__self__, memo))
246_deepcopy_dispatch[types.MethodType] = _deepcopy_method
247
Guido van Rossum558be281997-08-20 22:26:19 +0000248def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000249 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000250
Tim Peters88869f92001-01-14 23:36:06 +0000251 Because we remember objects by their id, we have
252 to assure that possibly temporary objects are kept
253 alive by referencing them.
254 We store a reference at the id of the memo, which should
255 normally not be used unless someone tries to deepcopy
256 the memo itself...
257 """
258 try:
259 memo[id(memo)].append(x)
260 except KeyError:
261 # aha, this is the first one :-)
262 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000263
Guido van Rossum1e91c142001-12-28 21:33:22 +0000264def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000265 if isinstance(info, str):
266 return x
267 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000268 if memo is None:
269 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000270 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000271 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000272 callable, args = info[:2]
273 if n > 2:
274 state = info[2]
275 else:
276 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000277 if n > 3:
278 listiter = info[3]
279 else:
280 listiter = None
281 if n > 4:
282 dictiter = info[4]
283 else:
284 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000285 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000286 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000287 y = callable(*args)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000288 memo[id(x)] = y
Antoine Pitrou3941a8f2010-09-04 17:40:21 +0000289
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000290 if state:
291 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000292 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000293 if hasattr(y, '__setstate__'):
294 y.__setstate__(state)
295 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000296 if isinstance(state, tuple) and len(state) == 2:
297 state, slotstate = state
298 else:
299 slotstate = None
300 if state is not None:
301 y.__dict__.update(state)
302 if slotstate is not None:
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000303 for key, value in slotstate.items():
Guido van Rossumc7557582003-02-06 19:53:22 +0000304 setattr(y, key, value)
Antoine Pitrou3941a8f2010-09-04 17:40:21 +0000305
306 if listiter is not None:
307 for item in listiter:
308 if deep:
309 item = deepcopy(item, memo)
310 y.append(item)
311 if dictiter is not None:
312 for key, value in dictiter:
313 if deep:
314 key = deepcopy(key, memo)
315 value = deepcopy(value, memo)
316 y[key] = value
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000317 return y
318
Guido van Rossum409780f1995-01-10 00:34:21 +0000319del d
320
321del types
322
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000323# Helper for instance creation without calling __init__
324class _EmptyClass:
325 pass
326
Guido van Rossum409780f1995-01-10 00:34:21 +0000327def _test():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000328 l = [None, 1, 2, 3.14, 'xyzzy', (1, 2), [3.14, 'abc'],
Tim Peters88869f92001-01-14 23:36:06 +0000329 {'abc': 'ABC'}, (), [], {}]
330 l1 = copy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000331 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000332 l1 = map(copy, l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000333 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000334 l1 = deepcopy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000335 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000336 class C:
337 def __init__(self, arg=None):
338 self.a = 1
339 self.arg = arg
340 if __name__ == '__main__':
341 import sys
342 file = sys.argv[0]
343 else:
344 file = __file__
345 self.fp = open(file)
346 self.fp.close()
347 def __getstate__(self):
348 return {'a': self.a, 'arg': self.arg}
349 def __setstate__(self, state):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000350 for key, value in state.items():
Raymond Hettingere0d49722002-06-02 18:55:56 +0000351 setattr(self, key, value)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000352 def __deepcopy__(self, memo=None):
Tim Peters88869f92001-01-14 23:36:06 +0000353 new = self.__class__(deepcopy(self.arg, memo))
354 new.a = self.a
355 return new
356 c = C('argument sketch')
357 l.append(c)
358 l2 = copy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000359 print(l == l2)
360 print(l)
361 print(l2)
Tim Peters88869f92001-01-14 23:36:06 +0000362 l2 = deepcopy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000363 print(l == l2)
364 print(l)
365 print(l2)
Tim Peters88869f92001-01-14 23:36:06 +0000366 l.append({l[1]: l, 'xyz': l[2]})
367 l3 = copy(l)
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000368 import reprlib
369 print(map(reprlib.repr, l))
370 print(map(reprlib.repr, l1))
371 print(map(reprlib.repr, l2))
372 print(map(reprlib.repr, l3))
Tim Peters88869f92001-01-14 23:36:06 +0000373 l3 = deepcopy(l)
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000374 print(map(reprlib.repr, l))
375 print(map(reprlib.repr, l1))
376 print(map(reprlib.repr, l2))
377 print(map(reprlib.repr, l3))
Antoine Pitrou3941a8f2010-09-04 17:40:21 +0000378 class odict(dict):
379 def __init__(self, d = {}):
380 self.a = 99
381 dict.__init__(self, d)
382 def __setitem__(self, k, i):
383 dict.__setitem__(self, k, i)
384 self.a
385 o = odict({"A" : "B"})
386 x = deepcopy(o)
387 print(o, x)
Guido van Rossum409780f1995-01-10 00:34:21 +0000388
389if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000390 _test()