blob: 4133a1f1dc324f43ae632947414e123236432689 [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
17 extent possible) inserts *the same objects* into in that the
18 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
Guido van Rossumabfdd701997-10-07 14:47:50 +000051# XXX need to support copy_reg here too...
52
Guido van Rossum409780f1995-01-10 00:34:21 +000053import types
Guido van Rossum5aac4e62003-02-06 22:57:00 +000054from copy_reg import _better_reduce
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
Tim Peters88869f92001-01-14 23:36:06 +000073 try:
74 copierfunction = _copy_dispatch[type(x)]
75 except KeyError:
76 try:
77 copier = x.__copy__
78 except AttributeError:
Guido van Rossum6cef6d52001-09-28 18:13:29 +000079 try:
Guido van Rossumc7557582003-02-06 19:53:22 +000080 reductor = x.__class__.__reduce__
81 if reductor == object.__reduce__:
82 reductor = _better_reduce
Guido van Rossum6cef6d52001-09-28 18:13:29 +000083 except AttributeError:
Guido van Rossumc7557582003-02-06 19:53:22 +000084 raise Error("un(shallow)copyable object of type %s" % type(x))
Guido van Rossum6cef6d52001-09-28 18:13:29 +000085 else:
Guido van Rossumc7557582003-02-06 19:53:22 +000086 y = _reconstruct(x, reductor(x), 0)
Guido van Rossum6cef6d52001-09-28 18:13:29 +000087 else:
88 y = copier()
Tim Peters88869f92001-01-14 23:36:06 +000089 else:
90 y = copierfunction(x)
91 return y
Guido van Rossumc7557582003-02-06 19:53:22 +000092
93
Guido van Rossum409780f1995-01-10 00:34:21 +000094_copy_dispatch = d = {}
95
96def _copy_atomic(x):
Tim Peters88869f92001-01-14 23:36:06 +000097 return x
Guido van Rossum409780f1995-01-10 00:34:21 +000098d[types.NoneType] = _copy_atomic
99d[types.IntType] = _copy_atomic
100d[types.LongType] = _copy_atomic
101d[types.FloatType] = _copy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000102d[types.BooleanType] = _copy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000103try:
104 d[types.ComplexType] = _copy_atomic
105except AttributeError:
106 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000107d[types.StringType] = _copy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000108try:
109 d[types.UnicodeType] = _copy_atomic
110except AttributeError:
111 pass
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000112try:
Tim Peters88869f92001-01-14 23:36:06 +0000113 d[types.CodeType] = _copy_atomic
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000114except AttributeError:
Tim Peters88869f92001-01-14 23:36:06 +0000115 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000116d[types.TypeType] = _copy_atomic
117d[types.XRangeType] = _copy_atomic
Guido van Rossum55d2f391995-03-14 17:41:36 +0000118d[types.ClassType] = _copy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000119
120def _copy_list(x):
Tim Peters88869f92001-01-14 23:36:06 +0000121 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000122d[types.ListType] = _copy_list
123
124def _copy_tuple(x):
Tim Peters88869f92001-01-14 23:36:06 +0000125 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000126d[types.TupleType] = _copy_tuple
127
128def _copy_dict(x):
Tim Peters88869f92001-01-14 23:36:06 +0000129 return x.copy()
Guido van Rossum409780f1995-01-10 00:34:21 +0000130d[types.DictionaryType] = _copy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000131if PyStringMap is not None:
132 d[PyStringMap] = _copy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000133
134def _copy_inst(x):
Tim Peters88869f92001-01-14 23:36:06 +0000135 if hasattr(x, '__copy__'):
136 return x.__copy__()
137 if hasattr(x, '__getinitargs__'):
138 args = x.__getinitargs__()
139 y = apply(x.__class__, args)
140 else:
141 y = _EmptyClass()
142 y.__class__ = x.__class__
143 if hasattr(x, '__getstate__'):
144 state = x.__getstate__()
145 else:
146 state = x.__dict__
147 if hasattr(y, '__setstate__'):
148 y.__setstate__(state)
149 else:
150 y.__dict__.update(state)
151 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000152d[types.InstanceType] = _copy_inst
153
154del d
155
156def deepcopy(x, memo = None):
Tim Peters88869f92001-01-14 23:36:06 +0000157 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000158
Tim Peters88869f92001-01-14 23:36:06 +0000159 See the module's __doc__ string for more info.
160 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000161
Tim Peters88869f92001-01-14 23:36:06 +0000162 if memo is None:
163 memo = {}
164 d = id(x)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000165 if d in memo:
Tim Peters88869f92001-01-14 23:36:06 +0000166 return memo[d]
167 try:
168 copierfunction = _deepcopy_dispatch[type(x)]
169 except KeyError:
170 try:
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000171 issc = issubclass(type(x), type)
172 except TypeError:
173 issc = 0
174 if issc:
175 y = _deepcopy_dispatch[type](x, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000176 else:
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000177 try:
178 copier = x.__deepcopy__
179 except AttributeError:
180 try:
Guido van Rossumc7557582003-02-06 19:53:22 +0000181 reductor = x.__class__.__reduce__
182 if reductor == object.__reduce__:
183 reductor = _better_reduce
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000184 except AttributeError:
Guido van Rossumc7557582003-02-06 19:53:22 +0000185 raise Error("un(shallow)copyable object of type %s" %
186 type(x))
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000187 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000188 y = _reconstruct(x, reductor(x), 1, memo)
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000189 else:
190 y = copier(memo)
Tim Peters88869f92001-01-14 23:36:06 +0000191 else:
192 y = copierfunction(x, memo)
193 memo[d] = y
Guido van Rossum61154602002-08-12 20:20:08 +0000194 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000195 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000196
197_deepcopy_dispatch = d = {}
198
199def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000200 return x
Guido van Rossum409780f1995-01-10 00:34:21 +0000201d[types.NoneType] = _deepcopy_atomic
202d[types.IntType] = _deepcopy_atomic
203d[types.LongType] = _deepcopy_atomic
204d[types.FloatType] = _deepcopy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000205d[types.BooleanType] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000206try:
207 d[types.ComplexType] = _deepcopy_atomic
208except AttributeError:
209 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000210d[types.StringType] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000211try:
212 d[types.UnicodeType] = _deepcopy_atomic
213except AttributeError:
214 pass
Guido van Rossum88b666c2002-02-28 23:19:52 +0000215try:
216 d[types.CodeType] = _deepcopy_atomic
217except AttributeError:
218 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000219d[types.TypeType] = _deepcopy_atomic
220d[types.XRangeType] = _deepcopy_atomic
221
222def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000223 y = []
224 memo[id(x)] = y
225 for a in x:
226 y.append(deepcopy(a, memo))
227 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000228d[types.ListType] = _deepcopy_list
229
230def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000231 y = []
232 for a in x:
233 y.append(deepcopy(a, memo))
234 d = id(x)
235 try:
236 return memo[d]
237 except KeyError:
238 pass
239 for i in range(len(x)):
240 if x[i] is not y[i]:
241 y = tuple(y)
242 break
243 else:
244 y = x
245 memo[d] = y
246 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000247d[types.TupleType] = _deepcopy_tuple
248
249def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000250 y = {}
251 memo[id(x)] = y
Raymond Hettingere0d49722002-06-02 18:55:56 +0000252 for key, value in x.iteritems():
253 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000254 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000255d[types.DictionaryType] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000256if PyStringMap is not None:
257 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000258
Guido van Rossum558be281997-08-20 22:26:19 +0000259def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000260 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000261
Tim Peters88869f92001-01-14 23:36:06 +0000262 Because we remember objects by their id, we have
263 to assure that possibly temporary objects are kept
264 alive by referencing them.
265 We store a reference at the id of the memo, which should
266 normally not be used unless someone tries to deepcopy
267 the memo itself...
268 """
269 try:
270 memo[id(memo)].append(x)
271 except KeyError:
272 # aha, this is the first one :-)
273 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000274
Guido van Rossum409780f1995-01-10 00:34:21 +0000275def _deepcopy_inst(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000276 if hasattr(x, '__deepcopy__'):
277 return x.__deepcopy__(memo)
278 if hasattr(x, '__getinitargs__'):
279 args = x.__getinitargs__()
Tim Peters88869f92001-01-14 23:36:06 +0000280 args = deepcopy(args, memo)
281 y = apply(x.__class__, args)
282 else:
283 y = _EmptyClass()
284 y.__class__ = x.__class__
285 memo[id(x)] = y
286 if hasattr(x, '__getstate__'):
287 state = x.__getstate__()
Tim Peters88869f92001-01-14 23:36:06 +0000288 else:
289 state = x.__dict__
290 state = deepcopy(state, memo)
291 if hasattr(y, '__setstate__'):
292 y.__setstate__(state)
293 else:
294 y.__dict__.update(state)
295 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000296d[types.InstanceType] = _deepcopy_inst
297
Guido van Rossum1e91c142001-12-28 21:33:22 +0000298def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000299 if isinstance(info, str):
300 return x
301 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000302 if memo is None:
303 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000304 n = len(info)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000305 assert n in (2, 3, 4, 5)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000306 callable, args = info[:2]
307 if n > 2:
308 state = info[2]
309 else:
310 state = {}
Guido van Rossum90e05b02003-02-06 18:18:23 +0000311 if n > 3:
312 listiter = info[3]
313 else:
314 listiter = None
315 if n > 4:
316 dictiter = info[4]
317 else:
318 dictiter = None
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000319 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000320 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000321 y = callable(*args)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000322 if listiter is not None:
323 for item in listiter:
324 if deep:
325 item = deepcopy(item, memo)
326 y.append(item)
327 if dictiter is not None:
328 for key, value in dictiter:
329 if deep:
330 key = deepcopy(key, memo)
331 value = deepcopy(value, memo)
332 y[key] = value
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000333 if state:
334 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000335 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000336 if hasattr(y, '__setstate__'):
337 y.__setstate__(state)
338 else:
Guido van Rossumc7557582003-02-06 19:53:22 +0000339 if isinstance(state, tuple) and len(state) == 2:
340 state, slotstate = state
341 else:
342 slotstate = None
343 if state is not None:
344 y.__dict__.update(state)
345 if slotstate is not None:
346 for key, value in slotstate.iteritems():
347 setattr(y, key, value)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000348 return y
349
Guido van Rossum409780f1995-01-10 00:34:21 +0000350del d
351
352del types
353
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000354# Helper for instance creation without calling __init__
355class _EmptyClass:
356 pass
357
Guido van Rossum409780f1995-01-10 00:34:21 +0000358def _test():
Tim Peters88869f92001-01-14 23:36:06 +0000359 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
360 {'abc': 'ABC'}, (), [], {}]
361 l1 = copy(l)
362 print l1==l
363 l1 = map(copy, l)
364 print l1==l
365 l1 = deepcopy(l)
366 print l1==l
367 class C:
368 def __init__(self, arg=None):
369 self.a = 1
370 self.arg = arg
371 if __name__ == '__main__':
372 import sys
373 file = sys.argv[0]
374 else:
375 file = __file__
376 self.fp = open(file)
377 self.fp.close()
378 def __getstate__(self):
379 return {'a': self.a, 'arg': self.arg}
380 def __setstate__(self, state):
Raymond Hettingere0d49722002-06-02 18:55:56 +0000381 for key, value in state.iteritems():
382 setattr(self, key, value)
Tim Peters88869f92001-01-14 23:36:06 +0000383 def __deepcopy__(self, memo = None):
384 new = self.__class__(deepcopy(self.arg, memo))
385 new.a = self.a
386 return new
387 c = C('argument sketch')
388 l.append(c)
389 l2 = copy(l)
390 print l == l2
391 print l
392 print l2
393 l2 = deepcopy(l)
394 print l == l2
395 print l
396 print l2
397 l.append({l[1]: l, 'xyz': l[2]})
398 l3 = copy(l)
399 import repr
400 print map(repr.repr, l)
401 print map(repr.repr, l1)
402 print map(repr.repr, l2)
403 print map(repr.repr, l3)
404 l3 = deepcopy(l)
405 import repr
406 print map(repr.repr, l)
407 print map(repr.repr, l1)
408 print map(repr.repr, l2)
409 print map(repr.repr, l3)
Guido van Rossum409780f1995-01-10 00:34:21 +0000410
411if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000412 _test()