blob: 59886cbe8ff8f37a7af0c89dce5bd7bda172776c [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 Rossum55d2f391995-03-14 17:41:36 +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
54
Fred Drake227b1202000-08-17 05:06:49 +000055class Error(Exception):
Tim Peters88869f92001-01-14 23:36:06 +000056 pass
57error = Error # backward compatibility
Guido van Rossum409780f1995-01-10 00:34:21 +000058
Guido van Rossumf8baad02000-11-27 21:53:14 +000059try:
60 from org.python.core import PyStringMap
61except ImportError:
62 PyStringMap = None
63
Guido van Rossum6cef6d52001-09-28 18:13:29 +000064__all__ = ["Error", "error", "copy", "deepcopy"]
Skip Montanaroe99d5ea2001-01-20 19:54:20 +000065
Guido van Rossum409780f1995-01-10 00:34:21 +000066def copy(x):
Tim Peters88869f92001-01-14 23:36:06 +000067 """Shallow copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +000068
Tim Peters88869f92001-01-14 23:36:06 +000069 See the module's __doc__ string for more info.
70 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +000071
Tim Peters88869f92001-01-14 23:36:06 +000072 try:
73 copierfunction = _copy_dispatch[type(x)]
74 except KeyError:
75 try:
76 copier = x.__copy__
77 except AttributeError:
Guido van Rossum6cef6d52001-09-28 18:13:29 +000078 try:
79 reductor = x.__reduce__
80 except AttributeError:
81 raise error, \
82 "un(shallow)copyable object of type %s" % type(x)
83 else:
84 y = _reconstruct(x, reductor(), 0)
85 else:
86 y = copier()
Tim Peters88869f92001-01-14 23:36:06 +000087 else:
88 y = copierfunction(x)
89 return y
Guido van Rossum409780f1995-01-10 00:34:21 +000090
91_copy_dispatch = d = {}
92
93def _copy_atomic(x):
Tim Peters88869f92001-01-14 23:36:06 +000094 return x
Guido van Rossum409780f1995-01-10 00:34:21 +000095d[types.NoneType] = _copy_atomic
96d[types.IntType] = _copy_atomic
97d[types.LongType] = _copy_atomic
98d[types.FloatType] = _copy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +000099d[types.BooleanType] = _copy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000100try:
101 d[types.ComplexType] = _copy_atomic
102except AttributeError:
103 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000104d[types.StringType] = _copy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000105try:
106 d[types.UnicodeType] = _copy_atomic
107except AttributeError:
108 pass
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000109try:
Tim Peters88869f92001-01-14 23:36:06 +0000110 d[types.CodeType] = _copy_atomic
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000111except AttributeError:
Tim Peters88869f92001-01-14 23:36:06 +0000112 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000113d[types.TypeType] = _copy_atomic
114d[types.XRangeType] = _copy_atomic
Guido van Rossum55d2f391995-03-14 17:41:36 +0000115d[types.ClassType] = _copy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000116
117def _copy_list(x):
Tim Peters88869f92001-01-14 23:36:06 +0000118 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000119d[types.ListType] = _copy_list
120
121def _copy_tuple(x):
Tim Peters88869f92001-01-14 23:36:06 +0000122 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000123d[types.TupleType] = _copy_tuple
124
125def _copy_dict(x):
Tim Peters88869f92001-01-14 23:36:06 +0000126 return x.copy()
Guido van Rossum409780f1995-01-10 00:34:21 +0000127d[types.DictionaryType] = _copy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000128if PyStringMap is not None:
129 d[PyStringMap] = _copy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000130
131def _copy_inst(x):
Tim Peters88869f92001-01-14 23:36:06 +0000132 if hasattr(x, '__copy__'):
133 return x.__copy__()
134 if hasattr(x, '__getinitargs__'):
135 args = x.__getinitargs__()
136 y = apply(x.__class__, args)
137 else:
138 y = _EmptyClass()
139 y.__class__ = x.__class__
140 if hasattr(x, '__getstate__'):
141 state = x.__getstate__()
142 else:
143 state = x.__dict__
144 if hasattr(y, '__setstate__'):
145 y.__setstate__(state)
146 else:
147 y.__dict__.update(state)
148 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000149d[types.InstanceType] = _copy_inst
150
151del d
152
153def deepcopy(x, memo = None):
Tim Peters88869f92001-01-14 23:36:06 +0000154 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000155
Tim Peters88869f92001-01-14 23:36:06 +0000156 See the module's __doc__ string for more info.
157 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000158
Tim Peters88869f92001-01-14 23:36:06 +0000159 if memo is None:
160 memo = {}
161 d = id(x)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000162 if d in memo:
Tim Peters88869f92001-01-14 23:36:06 +0000163 return memo[d]
164 try:
165 copierfunction = _deepcopy_dispatch[type(x)]
166 except KeyError:
167 try:
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000168 issc = issubclass(type(x), type)
169 except TypeError:
170 issc = 0
171 if issc:
172 y = _deepcopy_dispatch[type](x, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000173 else:
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000174 try:
175 copier = x.__deepcopy__
176 except AttributeError:
177 try:
178 reductor = x.__reduce__
179 except AttributeError:
180 raise error, \
181 "un-deep-copyable object of type %s" % type(x)
182 else:
183 y = _reconstruct(x, reductor(), 1, memo)
184 else:
185 y = copier(memo)
Tim Peters88869f92001-01-14 23:36:06 +0000186 else:
187 y = copierfunction(x, memo)
188 memo[d] = y
Guido van Rossum61154602002-08-12 20:20:08 +0000189 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000190 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000191
192_deepcopy_dispatch = d = {}
193
194def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000195 return x
Guido van Rossum409780f1995-01-10 00:34:21 +0000196d[types.NoneType] = _deepcopy_atomic
197d[types.IntType] = _deepcopy_atomic
198d[types.LongType] = _deepcopy_atomic
199d[types.FloatType] = _deepcopy_atomic
Martin v. Löwis71b75562003-01-16 10:40:00 +0000200d[types.BooleanType] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000201try:
202 d[types.ComplexType] = _deepcopy_atomic
203except AttributeError:
204 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000205d[types.StringType] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000206try:
207 d[types.UnicodeType] = _deepcopy_atomic
208except AttributeError:
209 pass
Guido van Rossum88b666c2002-02-28 23:19:52 +0000210try:
211 d[types.CodeType] = _deepcopy_atomic
212except AttributeError:
213 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000214d[types.TypeType] = _deepcopy_atomic
215d[types.XRangeType] = _deepcopy_atomic
216
217def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000218 y = []
219 memo[id(x)] = y
220 for a in x:
221 y.append(deepcopy(a, memo))
222 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000223d[types.ListType] = _deepcopy_list
224
225def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000226 y = []
227 for a in x:
228 y.append(deepcopy(a, memo))
229 d = id(x)
230 try:
231 return memo[d]
232 except KeyError:
233 pass
234 for i in range(len(x)):
235 if x[i] is not y[i]:
236 y = tuple(y)
237 break
238 else:
239 y = x
240 memo[d] = y
241 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000242d[types.TupleType] = _deepcopy_tuple
243
244def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000245 y = {}
246 memo[id(x)] = y
Raymond Hettingere0d49722002-06-02 18:55:56 +0000247 for key, value in x.iteritems():
248 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000249 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000250d[types.DictionaryType] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000251if PyStringMap is not None:
252 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000253
Guido van Rossum558be281997-08-20 22:26:19 +0000254def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000255 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000256
Tim Peters88869f92001-01-14 23:36:06 +0000257 Because we remember objects by their id, we have
258 to assure that possibly temporary objects are kept
259 alive by referencing them.
260 We store a reference at the id of the memo, which should
261 normally not be used unless someone tries to deepcopy
262 the memo itself...
263 """
264 try:
265 memo[id(memo)].append(x)
266 except KeyError:
267 # aha, this is the first one :-)
268 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000269
Guido van Rossum409780f1995-01-10 00:34:21 +0000270def _deepcopy_inst(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000271 if hasattr(x, '__deepcopy__'):
272 return x.__deepcopy__(memo)
273 if hasattr(x, '__getinitargs__'):
274 args = x.__getinitargs__()
Tim Peters88869f92001-01-14 23:36:06 +0000275 args = deepcopy(args, memo)
276 y = apply(x.__class__, args)
277 else:
278 y = _EmptyClass()
279 y.__class__ = x.__class__
280 memo[id(x)] = y
281 if hasattr(x, '__getstate__'):
282 state = x.__getstate__()
Tim Peters88869f92001-01-14 23:36:06 +0000283 else:
284 state = x.__dict__
285 state = deepcopy(state, memo)
286 if hasattr(y, '__setstate__'):
287 y.__setstate__(state)
288 else:
289 y.__dict__.update(state)
290 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000291d[types.InstanceType] = _deepcopy_inst
292
Guido van Rossum1e91c142001-12-28 21:33:22 +0000293def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000294 if isinstance(info, str):
295 return x
296 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000297 if memo is None:
298 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000299 n = len(info)
300 assert n in (2, 3)
301 callable, args = info[:2]
302 if n > 2:
303 state = info[2]
304 else:
305 state = {}
306 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000307 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000308 y = callable(*args)
309 if state:
310 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000311 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000312 if hasattr(y, '__setstate__'):
313 y.__setstate__(state)
314 else:
315 y.__dict__.update(state)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000316 return y
317
Guido van Rossum409780f1995-01-10 00:34:21 +0000318del d
319
320del types
321
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000322# Helper for instance creation without calling __init__
323class _EmptyClass:
324 pass
325
Guido van Rossum409780f1995-01-10 00:34:21 +0000326def _test():
Tim Peters88869f92001-01-14 23:36:06 +0000327 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
328 {'abc': 'ABC'}, (), [], {}]
329 l1 = copy(l)
330 print l1==l
331 l1 = map(copy, l)
332 print l1==l
333 l1 = deepcopy(l)
334 print l1==l
335 class C:
336 def __init__(self, arg=None):
337 self.a = 1
338 self.arg = arg
339 if __name__ == '__main__':
340 import sys
341 file = sys.argv[0]
342 else:
343 file = __file__
344 self.fp = open(file)
345 self.fp.close()
346 def __getstate__(self):
347 return {'a': self.a, 'arg': self.arg}
348 def __setstate__(self, state):
Raymond Hettingere0d49722002-06-02 18:55:56 +0000349 for key, value in state.iteritems():
350 setattr(self, key, value)
Tim Peters88869f92001-01-14 23:36:06 +0000351 def __deepcopy__(self, memo = None):
352 new = self.__class__(deepcopy(self.arg, memo))
353 new.a = self.a
354 return new
355 c = C('argument sketch')
356 l.append(c)
357 l2 = copy(l)
358 print l == l2
359 print l
360 print l2
361 l2 = deepcopy(l)
362 print l == l2
363 print l
364 print l2
365 l.append({l[1]: l, 'xyz': l[2]})
366 l3 = copy(l)
367 import repr
368 print map(repr.repr, l)
369 print map(repr.repr, l1)
370 print map(repr.repr, l2)
371 print map(repr.repr, l3)
372 l3 = deepcopy(l)
373 import repr
374 print map(repr.repr, l)
375 print map(repr.repr, l1)
376 print map(repr.repr, l2)
377 print map(repr.repr, l3)
Guido van Rossum409780f1995-01-10 00:34:21 +0000378
379if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000380 _test()