blob: e2474fe75b2b17bd2dea42f9cfba6d31da06169a [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
Guido van Rossum8b9def32001-09-28 18:16:13 +000099try:
100 d[types.ComplexType] = _copy_atomic
101except AttributeError:
102 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000103d[types.StringType] = _copy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000104try:
105 d[types.UnicodeType] = _copy_atomic
106except AttributeError:
107 pass
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000108try:
Tim Peters88869f92001-01-14 23:36:06 +0000109 d[types.CodeType] = _copy_atomic
Guido van Rossum2fff84d1999-01-25 21:37:02 +0000110except AttributeError:
Tim Peters88869f92001-01-14 23:36:06 +0000111 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000112d[types.TypeType] = _copy_atomic
113d[types.XRangeType] = _copy_atomic
Guido van Rossum55d2f391995-03-14 17:41:36 +0000114d[types.ClassType] = _copy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000115
116def _copy_list(x):
Tim Peters88869f92001-01-14 23:36:06 +0000117 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000118d[types.ListType] = _copy_list
119
120def _copy_tuple(x):
Tim Peters88869f92001-01-14 23:36:06 +0000121 return x[:]
Guido van Rossum409780f1995-01-10 00:34:21 +0000122d[types.TupleType] = _copy_tuple
123
124def _copy_dict(x):
Tim Peters88869f92001-01-14 23:36:06 +0000125 return x.copy()
Guido van Rossum409780f1995-01-10 00:34:21 +0000126d[types.DictionaryType] = _copy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000127if PyStringMap is not None:
128 d[PyStringMap] = _copy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000129
130def _copy_inst(x):
Tim Peters88869f92001-01-14 23:36:06 +0000131 if hasattr(x, '__copy__'):
132 return x.__copy__()
133 if hasattr(x, '__getinitargs__'):
134 args = x.__getinitargs__()
135 y = apply(x.__class__, args)
136 else:
137 y = _EmptyClass()
138 y.__class__ = x.__class__
139 if hasattr(x, '__getstate__'):
140 state = x.__getstate__()
141 else:
142 state = x.__dict__
143 if hasattr(y, '__setstate__'):
144 y.__setstate__(state)
145 else:
146 y.__dict__.update(state)
147 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000148d[types.InstanceType] = _copy_inst
149
150del d
151
152def deepcopy(x, memo = None):
Tim Peters88869f92001-01-14 23:36:06 +0000153 """Deep copy operation on arbitrary Python objects.
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000154
Tim Peters88869f92001-01-14 23:36:06 +0000155 See the module's __doc__ string for more info.
156 """
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000157
Tim Peters88869f92001-01-14 23:36:06 +0000158 if memo is None:
159 memo = {}
160 d = id(x)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000161 if d in memo:
Tim Peters88869f92001-01-14 23:36:06 +0000162 return memo[d]
163 try:
164 copierfunction = _deepcopy_dispatch[type(x)]
165 except KeyError:
166 try:
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000167 issc = issubclass(type(x), type)
168 except TypeError:
169 issc = 0
170 if issc:
171 y = _deepcopy_dispatch[type](x, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000172 else:
Guido van Rossum11ade1d2002-06-10 21:10:27 +0000173 try:
174 copier = x.__deepcopy__
175 except AttributeError:
176 try:
177 reductor = x.__reduce__
178 except AttributeError:
179 raise error, \
180 "un-deep-copyable object of type %s" % type(x)
181 else:
182 y = _reconstruct(x, reductor(), 1, memo)
183 else:
184 y = copier(memo)
Tim Peters88869f92001-01-14 23:36:06 +0000185 else:
186 y = copierfunction(x, memo)
187 memo[d] = y
Guido van Rossum61154602002-08-12 20:20:08 +0000188 _keep_alive(x, memo) # Make sure x lives at least as long as d
Tim Peters88869f92001-01-14 23:36:06 +0000189 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000190
191_deepcopy_dispatch = d = {}
192
193def _deepcopy_atomic(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000194 return x
Guido van Rossum409780f1995-01-10 00:34:21 +0000195d[types.NoneType] = _deepcopy_atomic
196d[types.IntType] = _deepcopy_atomic
197d[types.LongType] = _deepcopy_atomic
198d[types.FloatType] = _deepcopy_atomic
Guido van Rossum8b9def32001-09-28 18:16:13 +0000199try:
200 d[types.ComplexType] = _deepcopy_atomic
201except AttributeError:
202 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000203d[types.StringType] = _deepcopy_atomic
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000204try:
205 d[types.UnicodeType] = _deepcopy_atomic
206except AttributeError:
207 pass
Guido van Rossum88b666c2002-02-28 23:19:52 +0000208try:
209 d[types.CodeType] = _deepcopy_atomic
210except AttributeError:
211 pass
Guido van Rossum409780f1995-01-10 00:34:21 +0000212d[types.TypeType] = _deepcopy_atomic
213d[types.XRangeType] = _deepcopy_atomic
214
215def _deepcopy_list(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000216 y = []
217 memo[id(x)] = y
218 for a in x:
219 y.append(deepcopy(a, memo))
220 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000221d[types.ListType] = _deepcopy_list
222
223def _deepcopy_tuple(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000224 y = []
225 for a in x:
226 y.append(deepcopy(a, memo))
227 d = id(x)
228 try:
229 return memo[d]
230 except KeyError:
231 pass
232 for i in range(len(x)):
233 if x[i] is not y[i]:
234 y = tuple(y)
235 break
236 else:
237 y = x
238 memo[d] = y
239 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000240d[types.TupleType] = _deepcopy_tuple
241
242def _deepcopy_dict(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000243 y = {}
244 memo[id(x)] = y
Raymond Hettingere0d49722002-06-02 18:55:56 +0000245 for key, value in x.iteritems():
246 y[deepcopy(key, memo)] = deepcopy(value, memo)
Tim Peters88869f92001-01-14 23:36:06 +0000247 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000248d[types.DictionaryType] = _deepcopy_dict
Guido van Rossumf8baad02000-11-27 21:53:14 +0000249if PyStringMap is not None:
250 d[PyStringMap] = _deepcopy_dict
Guido van Rossum409780f1995-01-10 00:34:21 +0000251
Guido van Rossum558be281997-08-20 22:26:19 +0000252def _keep_alive(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000253 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000254
Tim Peters88869f92001-01-14 23:36:06 +0000255 Because we remember objects by their id, we have
256 to assure that possibly temporary objects are kept
257 alive by referencing them.
258 We store a reference at the id of the memo, which should
259 normally not be used unless someone tries to deepcopy
260 the memo itself...
261 """
262 try:
263 memo[id(memo)].append(x)
264 except KeyError:
265 # aha, this is the first one :-)
266 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000267
Guido van Rossum409780f1995-01-10 00:34:21 +0000268def _deepcopy_inst(x, memo):
Tim Peters88869f92001-01-14 23:36:06 +0000269 if hasattr(x, '__deepcopy__'):
270 return x.__deepcopy__(memo)
271 if hasattr(x, '__getinitargs__'):
272 args = x.__getinitargs__()
Tim Peters88869f92001-01-14 23:36:06 +0000273 args = deepcopy(args, memo)
274 y = apply(x.__class__, args)
275 else:
276 y = _EmptyClass()
277 y.__class__ = x.__class__
278 memo[id(x)] = y
279 if hasattr(x, '__getstate__'):
280 state = x.__getstate__()
Tim Peters88869f92001-01-14 23:36:06 +0000281 else:
282 state = x.__dict__
283 state = deepcopy(state, memo)
284 if hasattr(y, '__setstate__'):
285 y.__setstate__(state)
286 else:
287 y.__dict__.update(state)
288 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000289d[types.InstanceType] = _deepcopy_inst
290
Guido van Rossum1e91c142001-12-28 21:33:22 +0000291def _reconstruct(x, info, deep, memo=None):
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000292 if isinstance(info, str):
293 return x
294 assert isinstance(info, tuple)
Guido van Rossum1e91c142001-12-28 21:33:22 +0000295 if memo is None:
296 memo = {}
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000297 n = len(info)
298 assert n in (2, 3)
299 callable, args = info[:2]
300 if n > 2:
301 state = info[2]
302 else:
303 state = {}
304 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000305 args = deepcopy(args, memo)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000306 y = callable(*args)
307 if state:
308 if deep:
Guido van Rossum1e91c142001-12-28 21:33:22 +0000309 state = deepcopy(state, memo)
Guido van Rossum3e3583c2002-06-06 17:41:20 +0000310 if hasattr(y, '__setstate__'):
311 y.__setstate__(state)
312 else:
313 y.__dict__.update(state)
Guido van Rossum6cef6d52001-09-28 18:13:29 +0000314 return y
315
Guido van Rossum409780f1995-01-10 00:34:21 +0000316del d
317
318del types
319
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000320# Helper for instance creation without calling __init__
321class _EmptyClass:
322 pass
323
Guido van Rossum409780f1995-01-10 00:34:21 +0000324def _test():
Tim Peters88869f92001-01-14 23:36:06 +0000325 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
326 {'abc': 'ABC'}, (), [], {}]
327 l1 = copy(l)
328 print l1==l
329 l1 = map(copy, l)
330 print l1==l
331 l1 = deepcopy(l)
332 print l1==l
333 class C:
334 def __init__(self, arg=None):
335 self.a = 1
336 self.arg = arg
337 if __name__ == '__main__':
338 import sys
339 file = sys.argv[0]
340 else:
341 file = __file__
342 self.fp = open(file)
343 self.fp.close()
344 def __getstate__(self):
345 return {'a': self.a, 'arg': self.arg}
346 def __setstate__(self, state):
Raymond Hettingere0d49722002-06-02 18:55:56 +0000347 for key, value in state.iteritems():
348 setattr(self, key, value)
Tim Peters88869f92001-01-14 23:36:06 +0000349 def __deepcopy__(self, memo = None):
350 new = self.__class__(deepcopy(self.arg, memo))
351 new.a = self.a
352 return new
353 c = C('argument sketch')
354 l.append(c)
355 l2 = copy(l)
356 print l == l2
357 print l
358 print l2
359 l2 = deepcopy(l)
360 print l == l2
361 print l
362 print l2
363 l.append({l[1]: l, 'xyz': l[2]})
364 l3 = copy(l)
365 import repr
366 print map(repr.repr, l)
367 print map(repr.repr, l1)
368 print map(repr.repr, l2)
369 print map(repr.repr, l3)
370 l3 = deepcopy(l)
371 import repr
372 print map(repr.repr, l)
373 print map(repr.repr, l1)
374 print map(repr.repr, l2)
375 print map(repr.repr, l3)
Guido van Rossum409780f1995-01-10 00:34:21 +0000376
377if __name__ == '__main__':
Tim Peters88869f92001-01-14 23:36:06 +0000378 _test()