blob: 089d101c7ca3f0172fd9af0580af34148cf1358f [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
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
Antoine Pitrou1fc0d2b2009-11-28 15:58:27 +0000242def _deepcopy_method(x, memo): # Copy instance methods
243 return type(x)(x.__func__, deepcopy(x.__self__, memo))
244_deepcopy_dispatch[types.MethodType] = _deepcopy_method
245
Guido van Rossum558be281997-08-20 22:26:19 +0000246def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000247 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000248
Tim Peters88869f92001-01-14 23:36:06 +0000249 Because we remember objects by their id, we have
250 to assure that possibly temporary objects are kept
251 alive by referencing them.
252 We store a reference at the id of the memo, which should
253 normally not be used unless someone tries to deepcopy
254 the memo itself...
255 """
256 try:
257 memo[id(memo)].append(x)
258 except KeyError:
259 # aha, this is the first one :-)
260 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000261
Guido van Rossum1e91c142001-12-28 21:33:22 +0000262def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000263 if isinstance(info, str):
264 return x
265 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000266 if memo is None:
267 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000268 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000269 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000270 callable, args = info[:2]
271 if n > 2:
272 state = info[2]
273 else:
274 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000275 if n > 3:
276 listiter = info[3]
277 else:
278 listiter = None
279 if n > 4:
280 dictiter = info[4]
281 else:
282 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000283 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000284 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000285 y = callable(*args)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000286 memo[id(x)] = y
Antoine Pitrou3941a8f2010-09-04 17:40:21 +0000287
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000288 if state:
289 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000290 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000291 if hasattr(y, '__setstate__'):
292 y.__setstate__(state)
293 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000294 if isinstance(state, tuple) and len(state) == 2:
295 state, slotstate = state
296 else:
297 slotstate = None
298 if state is not None:
299 y.__dict__.update(state)
300 if slotstate is not None:
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000301 for key, value in slotstate.items():
Guido van Rossumc7557582003-02-06 19:53:22 +0000302 setattr(y, key, value)
Antoine Pitrou3941a8f2010-09-04 17:40:21 +0000303
304 if listiter is not None:
305 for item in listiter:
306 if deep:
307 item = deepcopy(item, memo)
308 y.append(item)
309 if dictiter is not None:
310 for key, value in dictiter:
311 if deep:
312 key = deepcopy(key, memo)
313 value = deepcopy(value, memo)
314 y[key] = value
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000315 return y
316
Guido van Rossum409780f1995-01-10 00:34:21 +0000317del d
318
319del types
320
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000321# Helper for instance creation without calling __init__
322class _EmptyClass:
323 pass
324
Guido van Rossum409780f1995-01-10 00:34:21 +0000325def _test():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000326 l = [None, 1, 2, 3.14, 'xyzzy', (1, 2), [3.14, 'abc'],
Tim Peters88869f92001-01-14 23:36:06 +0000327 {'abc': 'ABC'}, (), [], {}]
328 l1 = copy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000329 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000330 l1 = map(copy, l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000331 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000332 l1 = deepcopy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000333 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000334 class C:
335 def __init__(self, arg=None):
336 self.a = 1
337 self.arg = arg
338 if __name__ == '__main__':
339 import sys
340 file = sys.argv[0]
341 else:
342 file = __file__
343 self.fp = open(file)
344 self.fp.close()
345 def __getstate__(self):
346 return {'a': self.a, 'arg': self.arg}
347 def __setstate__(self, state):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000348 for key, value in state.items():
Raymond Hettingere0d49722002-06-02 18:55:56 +0000349 setattr(self, key, value)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000350 def __deepcopy__(self, memo=None):
Tim Peters88869f92001-01-14 23:36:06 +0000351 new = self.__class__(deepcopy(self.arg, memo))
352 new.a = self.a
353 return new
354 c = C('argument sketch')
355 l.append(c)
356 l2 = copy(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 l2 = deepcopy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000361 print(l == l2)
362 print(l)
363 print(l2)
Tim Peters88869f92001-01-14 23:36:06 +0000364 l.append({l[1]: l, 'xyz': l[2]})
365 l3 = copy(l)
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000366 import reprlib
367 print(map(reprlib.repr, l))
368 print(map(reprlib.repr, l1))
369 print(map(reprlib.repr, l2))
370 print(map(reprlib.repr, l3))
Tim Peters88869f92001-01-14 23:36:06 +0000371 l3 = deepcopy(l)
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000372 print(map(reprlib.repr, l))
373 print(map(reprlib.repr, l1))
374 print(map(reprlib.repr, l2))
375 print(map(reprlib.repr, l3))
Antoine Pitrou3941a8f2010-09-04 17:40:21 +0000376 class odict(dict):
377 def __init__(self, d = {}):
378 self.a = 99
379 dict.__init__(self, d)
380 def __setitem__(self, k, i):
381 dict.__setitem__(self, k, i)
382 self.a
383 o = odict({"A" : "B"})
384 x = deepcopy(o)
385 print(o, x)
Guido van Rossum409780f1995-01-10 00:34:21 +0000386
387if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000388 _test()