blob: 9576575e20830eb75eb386da1acf1ba9cf188ecb [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
5 import copy
6
7 x = copy.copy(y) # make a shallow copy of y
8 x = copy.deepcopy(y) # make a deep copy of y
9
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):
56 pass
57error = Error # backward compatibility
Guido van Rossum409780f1995-01-10 00:34:21 +000058
59def copy(x):
Guido van Rossumcc6764c1995-02-09 17:18:10 +000060 """Shallow copy operation on arbitrary Python objects.
61
62 See the module's __doc__ string for more info.
63 """
64
Guido van Rossum409780f1995-01-10 00:34:21 +000065 try:
66 copierfunction = _copy_dispatch[type(x)]
67 except KeyError:
68 try:
69 copier = x.__copy__
70 except AttributeError:
Guido van Rossum55d2f391995-03-14 17:41:36 +000071 raise error, \
Guido van Rossumcc6764c1995-02-09 17:18:10 +000072 "un(shallow)copyable object of type %s" % type(x)
Guido van Rossum409780f1995-01-10 00:34:21 +000073 y = copier()
74 else:
75 y = copierfunction(x)
76 return y
77
78_copy_dispatch = d = {}
79
80def _copy_atomic(x):
81 return x
82d[types.NoneType] = _copy_atomic
83d[types.IntType] = _copy_atomic
84d[types.LongType] = _copy_atomic
85d[types.FloatType] = _copy_atomic
86d[types.StringType] = _copy_atomic
Marc-André Lemburgf156a442000-09-07 11:00:03 +000087d[types.UnicodeType] = _copy_atomic
Guido van Rossum2fff84d1999-01-25 21:37:02 +000088try:
89 d[types.CodeType] = _copy_atomic
90except AttributeError:
91 pass
Guido van Rossum409780f1995-01-10 00:34:21 +000092d[types.TypeType] = _copy_atomic
93d[types.XRangeType] = _copy_atomic
Guido van Rossum55d2f391995-03-14 17:41:36 +000094d[types.ClassType] = _copy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +000095
96def _copy_list(x):
97 return x[:]
98d[types.ListType] = _copy_list
99
100def _copy_tuple(x):
101 return x[:]
102d[types.TupleType] = _copy_tuple
103
104def _copy_dict(x):
Guido van Rossumf7cea101997-05-28 19:31:14 +0000105 return x.copy()
Guido van Rossum409780f1995-01-10 00:34:21 +0000106d[types.DictionaryType] = _copy_dict
107
108def _copy_inst(x):
109 if hasattr(x, '__copy__'):
110 return x.__copy__()
111 if hasattr(x, '__getinitargs__'):
112 args = x.__getinitargs__()
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000113 y = apply(x.__class__, args)
Guido van Rossum409780f1995-01-10 00:34:21 +0000114 else:
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000115 y = _EmptyClass()
116 y.__class__ = x.__class__
Guido van Rossum409780f1995-01-10 00:34:21 +0000117 if hasattr(x, '__getstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000118 state = x.__getstate__()
Guido van Rossum409780f1995-01-10 00:34:21 +0000119 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000120 state = x.__dict__
Guido van Rossumfefbbe51995-03-22 10:10:31 +0000121 if hasattr(y, '__setstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000122 y.__setstate__(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000123 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000124 y.__dict__.update(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000125 return y
126d[types.InstanceType] = _copy_inst
127
128del d
129
130def deepcopy(x, memo = None):
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000131 """Deep copy operation on arbitrary Python objects.
132
133 See the module's __doc__ string for more info.
134 """
135
Guido van Rossum409780f1995-01-10 00:34:21 +0000136 if memo is None:
137 memo = {}
138 d = id(x)
139 if memo.has_key(d):
140 return memo[d]
141 try:
142 copierfunction = _deepcopy_dispatch[type(x)]
143 except KeyError:
144 try:
145 copier = x.__deepcopy__
146 except AttributeError:
Guido van Rossum55d2f391995-03-14 17:41:36 +0000147 raise error, \
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000148 "un-deep-copyable object of type %s" % type(x)
Guido van Rossum409780f1995-01-10 00:34:21 +0000149 y = copier(memo)
150 else:
151 y = copierfunction(x, memo)
152 memo[d] = y
153 return y
154
155_deepcopy_dispatch = d = {}
156
157def _deepcopy_atomic(x, memo):
158 return x
159d[types.NoneType] = _deepcopy_atomic
160d[types.IntType] = _deepcopy_atomic
161d[types.LongType] = _deepcopy_atomic
162d[types.FloatType] = _deepcopy_atomic
163d[types.StringType] = _deepcopy_atomic
Marc-André Lemburgf156a442000-09-07 11:00:03 +0000164d[types.UnicodeType] = _deepcopy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +0000165d[types.CodeType] = _deepcopy_atomic
166d[types.TypeType] = _deepcopy_atomic
167d[types.XRangeType] = _deepcopy_atomic
168
169def _deepcopy_list(x, memo):
170 y = []
171 memo[id(x)] = y
172 for a in x:
173 y.append(deepcopy(a, memo))
174 return y
175d[types.ListType] = _deepcopy_list
176
177def _deepcopy_tuple(x, memo):
178 y = []
179 for a in x:
180 y.append(deepcopy(a, memo))
181 d = id(x)
182 try:
183 return memo[d]
184 except KeyError:
185 pass
186 for i in range(len(x)):
187 if x[i] is not y[i]:
Guido van Rossum6afff611996-06-17 17:10:11 +0000188 y = tuple(y)
189 break
190 else:
191 y = x
192 memo[d] = y
193 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000194d[types.TupleType] = _deepcopy_tuple
195
196def _deepcopy_dict(x, memo):
197 y = {}
198 memo[id(x)] = y
199 for key in x.keys():
200 y[deepcopy(key, memo)] = deepcopy(x[key], memo)
201 return y
202d[types.DictionaryType] = _deepcopy_dict
203
Guido van Rossum558be281997-08-20 22:26:19 +0000204def _keep_alive(x, memo):
Guido van Rossum8ca84201998-03-26 20:56:10 +0000205 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000206
Guido van Rossum8ca84201998-03-26 20:56:10 +0000207 Because we remember objects by their id, we have
208 to assure that possibly temporary objects are kept
209 alive by referencing them.
210 We store a reference at the id of the memo, which should
211 normally not be used unless someone tries to deepcopy
212 the memo itself...
213 """
214 try:
215 memo[id(memo)].append(x)
216 except KeyError:
217 # aha, this is the first one :-)
218 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000219
Guido van Rossum409780f1995-01-10 00:34:21 +0000220def _deepcopy_inst(x, memo):
221 if hasattr(x, '__deepcopy__'):
Guido van Rossum677fc841998-03-13 20:12:17 +0000222 return x.__deepcopy__(memo)
Guido van Rossum409780f1995-01-10 00:34:21 +0000223 if hasattr(x, '__getinitargs__'):
224 args = x.__getinitargs__()
Guido van Rossum558be281997-08-20 22:26:19 +0000225 _keep_alive(args, memo)
Guido van Rossum409780f1995-01-10 00:34:21 +0000226 args = deepcopy(args, memo)
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000227 y = apply(x.__class__, args)
Guido van Rossum409780f1995-01-10 00:34:21 +0000228 else:
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000229 y = _EmptyClass()
230 y.__class__ = x.__class__
Guido van Rossum409780f1995-01-10 00:34:21 +0000231 memo[id(x)] = y
232 if hasattr(x, '__getstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000233 state = x.__getstate__()
234 _keep_alive(state, memo)
Guido van Rossum409780f1995-01-10 00:34:21 +0000235 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000236 state = x.__dict__
Guido van Rossum409780f1995-01-10 00:34:21 +0000237 state = deepcopy(state, memo)
Guido van Rossumfefbbe51995-03-22 10:10:31 +0000238 if hasattr(y, '__setstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000239 y.__setstate__(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000240 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000241 y.__dict__.update(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000242 return y
243d[types.InstanceType] = _deepcopy_inst
244
245del d
246
247del types
248
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000249# Helper for instance creation without calling __init__
250class _EmptyClass:
251 pass
252
Guido van Rossum409780f1995-01-10 00:34:21 +0000253def _test():
Guido van Rossum55d2f391995-03-14 17:41:36 +0000254 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
255 {'abc': 'ABC'}, (), [], {}]
Guido van Rossum409780f1995-01-10 00:34:21 +0000256 l1 = copy(l)
257 print l1==l
258 l1 = map(copy, l)
259 print l1==l
260 l1 = deepcopy(l)
261 print l1==l
262 class C:
263 def __init__(self, arg=None):
264 self.a = 1
265 self.arg = arg
Guido van Rossumf7cea101997-05-28 19:31:14 +0000266 if __name__ == '__main__':
267 import sys
268 file = sys.argv[0]
269 else:
270 file = __file__
271 self.fp = open(file)
Guido van Rossum409780f1995-01-10 00:34:21 +0000272 self.fp.close()
273 def __getstate__(self):
274 return {'a': self.a, 'arg': self.arg}
275 def __setstate__(self, state):
276 for key in state.keys():
277 setattr(self, key, state[key])
278 def __deepcopy__(self, memo = None):
279 new = self.__class__(deepcopy(self.arg, memo))
280 new.a = self.a
281 return new
282 c = C('argument sketch')
283 l.append(c)
284 l2 = copy(l)
285 print l == l2
286 print l
287 print l2
288 l2 = deepcopy(l)
289 print l == l2
290 print l
291 print l2
292 l.append({l[1]: l, 'xyz': l[2]})
293 l3 = copy(l)
294 import repr
295 print map(repr.repr, l)
296 print map(repr.repr, l1)
297 print map(repr.repr, l2)
298 print map(repr.repr, l3)
299 l3 = deepcopy(l)
300 import repr
301 print map(repr.repr, l)
302 print map(repr.repr, l1)
303 print map(repr.repr, l2)
304 print map(repr.repr, l3)
305
306if __name__ == '__main__':
307 _test()