blob: 37e35cf93a72504b7b639bb43c986bb352621ff2 [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
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
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000100def _copy_immutable(x):
Tim Peters88869f92001-01-14 23:36:06 +0000101 return x
Guido van Rossume2a383d2007-01-15 16:59:06 +0000102for t in (type(None), int, int, float, bool, str, tuple,
Raymond Hettingerf0e35692004-03-08 05:59:33 +0000103 frozenset, type, xrange, types.ClassType,
Guido van Rossum1968ad32006-02-25 22:38:04 +0000104 types.BuiltinFunctionType,
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
Guido van Rossum409780f1995-01-10 00:34:21 +0000122del d
123
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000124def deepcopy(x, memo=None, _nil=[]):
Tim Peters88869f92001-01-14 23:36:06 +0000125 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000126
Tim Peters88869f92001-01-14 23:36:06 +0000127 See the module's __doc__ string for more info.
128 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000129
Tim Peters88869f92001-01-14 23:36:06 +0000130 if memo is None:
131 memo = {}
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000132
Tim Peters88869f92001-01-14 23:36:06 +0000133 d = id(x)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000134 y = memo.get(d, _nil)
135 if y is not _nil:
136 return y
137
138 cls = type(x)
139
140 copier = _deepcopy_dispatch.get(cls)
141 if copier:
142 y = copier(x, memo)
143 else:
Tim Peters88869f92001-01-14 23:36:06 +0000144 try:
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000145 issc = issubclass(cls, type)
146 except TypeError: # cls is not a class (old Boost; see SF #502085)
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000147 issc = 0
148 if issc:
Guido van Rossume6908832003-02-19 01:19:28 +0000149 y = _deepcopy_atomic(x, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000150 else:
Guido van Rossume6908832003-02-19 01:19:28 +0000151 copier = getattr(x, "__deepcopy__", None)
152 if copier:
153 y = copier(memo)
154 else:
155 reductor = dispatch_table.get(cls)
156 if reductor:
157 rv = reductor(x)
158 else:
159 reductor = getattr(x, "__reduce_ex__", None)
160 if reductor:
161 rv = reductor(2)
162 else:
163 reductor = getattr(x, "__reduce__", None)
164 if reductor:
165 rv = reductor()
166 else:
167 raise Error(
168 "un(deep)copyable object of type %s" % cls)
169 y = _reconstruct(x, rv, 1, memo)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000170
Tim Peters88869f92001-01-14 23:36:06 +0000171 memo[d] = y
Guido van Rossum61154602002-08-12 20:20:08 +0000172 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000173 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000174
175_deepcopy_dispatch = d = {}
176
177def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000178 return x
Raymond Hettingerf7153662005-02-07 14:16:21 +0000179d[type(None)] = _deepcopy_atomic
180d[int] = _deepcopy_atomic
Guido van Rossume2a383d2007-01-15 16:59:06 +0000181d[int] = _deepcopy_atomic
Raymond Hettingerf7153662005-02-07 14:16:21 +0000182d[float] = _deepcopy_atomic
183d[bool] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000184try:
Raymond Hettingerf7153662005-02-07 14:16:21 +0000185 d[complex] = _deepcopy_atomic
Martin v. Löwise2713be2005-03-08 15:03:08 +0000186except NameError:
Guido van Rossum8b9def32001-09-28 18:16:13 +0000187 pass
Raymond Hettingerf7153662005-02-07 14:16:21 +0000188d[str] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000189try:
Raymond Hettingerf7153662005-02-07 14:16:21 +0000190 d[unicode] = _deepcopy_atomic
Martin v. Löwise2713be2005-03-08 15:03:08 +0000191except NameError:
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000192 pass
Guido van Rossum88b666c2002-02-28 23:19:52 +0000193try:
194 d[types.CodeType] = _deepcopy_atomic
195except AttributeError:
196 pass
Raymond Hettingerf7153662005-02-07 14:16:21 +0000197d[type] = _deepcopy_atomic
198d[xrange] = _deepcopy_atomic
Guido van Rossum1dca4822003-02-07 17:53:23 +0000199d[types.ClassType] = _deepcopy_atomic
Martin v. Löwisba8f5ff2003-06-14 07:10:06 +0000200d[types.BuiltinFunctionType] = _deepcopy_atomic
Guido van Rossum1968ad32006-02-25 22:38:04 +0000201d[types.FunctionType] = _deepcopy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000202
203def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000204 y = []
205 memo[id(x)] = y
206 for a in x:
207 y.append(deepcopy(a, memo))
208 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000209d[list] = _deepcopy_list
Guido van Rossum409780f1995-01-10 00:34:21 +0000210
211def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000212 y = []
213 for a in x:
214 y.append(deepcopy(a, memo))
215 d = id(x)
216 try:
217 return memo[d]
218 except KeyError:
219 pass
220 for i in range(len(x)):
221 if x[i] is not y[i]:
222 y = tuple(y)
223 break
224 else:
225 y = x
226 memo[d] = y
227 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000228d[tuple] = _deepcopy_tuple
Guido van Rossum409780f1995-01-10 00:34:21 +0000229
230def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000231 y = {}
232 memo[id(x)] = y
Raymond Hettingere0d49722002-06-02 18:55:56 +0000233 for key, value in x.iteritems():
234 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000235 return y
Raymond Hettingerf7153662005-02-07 14:16:21 +0000236d[dict] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000237if PyStringMap is not None:
238 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000239
Guido van Rossum558be281997-08-20 22:26:19 +0000240def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000241 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000242
Tim Peters88869f92001-01-14 23:36:06 +0000243 Because we remember objects by their id, we have
244 to assure that possibly temporary objects are kept
245 alive by referencing them.
246 We store a reference at the id of the memo, which should
247 normally not be used unless someone tries to deepcopy
248 the memo itself...
249 """
250 try:
251 memo[id(memo)].append(x)
252 except KeyError:
253 # aha, this is the first one :-)
254 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000255
Guido van Rossum1e91c142001-12-28 21:33:22 +0000256def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000257 if isinstance(info, str):
258 return x
259 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000260 if memo is None:
261 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000262 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000263 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000264 callable, args = info[:2]
265 if n > 2:
266 state = info[2]
267 else:
268 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000269 if n > 3:
270 listiter = info[3]
271 else:
272 listiter = None
273 if n > 4:
274 dictiter = info[4]
275 else:
276 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000277 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000278 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000279 y = callable(*args)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000280 memo[id(x)] = y
Guido van Rossum90e05b02003-02-06 18:18:23 +0000281 if listiter is not None:
282 for item in listiter:
283 if deep:
284 item = deepcopy(item, memo)
285 y.append(item)
286 if dictiter is not None:
287 for key, value in dictiter:
288 if deep:
289 key = deepcopy(key, memo)
290 value = deepcopy(value, memo)
291 y[key] = value
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000292 if state:
293 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000294 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000295 if hasattr(y, '__setstate__'):
296 y.__setstate__(state)
297 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000298 if isinstance(state, tuple) and len(state) == 2:
299 state, slotstate = state
300 else:
301 slotstate = None
302 if state is not None:
303 y.__dict__.update(state)
304 if slotstate is not None:
305 for key, value in slotstate.iteritems():
306 setattr(y, key, value)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000307 return y
308
Guido van Rossum409780f1995-01-10 00:34:21 +0000309del d
310
311del types
312
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000313# Helper for instance creation without calling __init__
314class _EmptyClass:
315 pass
316
Guido van Rossum409780f1995-01-10 00:34:21 +0000317def _test():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000318 l = [None, 1, 2, 3.14, 'xyzzy', (1, 2), [3.14, 'abc'],
Tim Peters88869f92001-01-14 23:36:06 +0000319 {'abc': 'ABC'}, (), [], {}]
320 l1 = copy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000321 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000322 l1 = map(copy, l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000323 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000324 l1 = deepcopy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000325 print(l1==l)
Tim Peters88869f92001-01-14 23:36:06 +0000326 class C:
327 def __init__(self, arg=None):
328 self.a = 1
329 self.arg = arg
330 if __name__ == '__main__':
331 import sys
332 file = sys.argv[0]
333 else:
334 file = __file__
335 self.fp = open(file)
336 self.fp.close()
337 def __getstate__(self):
338 return {'a': self.a, 'arg': self.arg}
339 def __setstate__(self, state):
Raymond Hettingere0d49722002-06-02 18:55:56 +0000340 for key, value in state.iteritems():
341 setattr(self, key, value)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000342 def __deepcopy__(self, memo=None):
Tim Peters88869f92001-01-14 23:36:06 +0000343 new = self.__class__(deepcopy(self.arg, memo))
344 new.a = self.a
345 return new
346 c = C('argument sketch')
347 l.append(c)
348 l2 = copy(l)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000349 print(l == l2)
350 print(l)
351 print(l2)
Tim Peters88869f92001-01-14 23:36:06 +0000352 l2 = deepcopy(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 l.append({l[1]: l, 'xyz': l[2]})
357 l3 = copy(l)
358 import repr
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000359 print(map(repr.repr, l))
360 print(map(repr.repr, l1))
361 print(map(repr.repr, l2))
362 print(map(repr.repr, l3))
Tim Peters88869f92001-01-14 23:36:06 +0000363 l3 = deepcopy(l)
364 import repr
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000365 print(map(repr.repr, l))
366 print(map(repr.repr, l1))
367 print(map(repr.repr, l2))
368 print(map(repr.repr, l3))
Guido van Rossum409780f1995-01-10 00:34:21 +0000369
370if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000371 _test()