blob: 100ea13a6a39fac94c4ad797eb9e55c014e38f19 [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
Guido van Rossum2fff84d1999-01-25 21:37:02 +000087try:
88 d[types.CodeType] = _copy_atomic
89except AttributeError:
90 pass
Guido van Rossum409780f1995-01-10 00:34:21 +000091d[types.TypeType] = _copy_atomic
92d[types.XRangeType] = _copy_atomic
Guido van Rossum55d2f391995-03-14 17:41:36 +000093d[types.ClassType] = _copy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +000094
95def _copy_list(x):
96 return x[:]
97d[types.ListType] = _copy_list
98
99def _copy_tuple(x):
100 return x[:]
101d[types.TupleType] = _copy_tuple
102
103def _copy_dict(x):
Guido van Rossumf7cea101997-05-28 19:31:14 +0000104 return x.copy()
Guido van Rossum409780f1995-01-10 00:34:21 +0000105d[types.DictionaryType] = _copy_dict
106
107def _copy_inst(x):
108 if hasattr(x, '__copy__'):
109 return x.__copy__()
110 if hasattr(x, '__getinitargs__'):
111 args = x.__getinitargs__()
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000112 y = apply(x.__class__, args)
Guido van Rossum409780f1995-01-10 00:34:21 +0000113 else:
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000114 y = _EmptyClass()
115 y.__class__ = x.__class__
Guido van Rossum409780f1995-01-10 00:34:21 +0000116 if hasattr(x, '__getstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000117 state = x.__getstate__()
Guido van Rossum409780f1995-01-10 00:34:21 +0000118 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000119 state = x.__dict__
Guido van Rossumfefbbe51995-03-22 10:10:31 +0000120 if hasattr(y, '__setstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000121 y.__setstate__(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000122 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000123 y.__dict__.update(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000124 return y
125d[types.InstanceType] = _copy_inst
126
127del d
128
129def deepcopy(x, memo = None):
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000130 """Deep copy operation on arbitrary Python objects.
131
132 See the module's __doc__ string for more info.
133 """
134
Guido van Rossum409780f1995-01-10 00:34:21 +0000135 if memo is None:
136 memo = {}
137 d = id(x)
138 if memo.has_key(d):
139 return memo[d]
140 try:
141 copierfunction = _deepcopy_dispatch[type(x)]
142 except KeyError:
143 try:
144 copier = x.__deepcopy__
145 except AttributeError:
Guido van Rossum55d2f391995-03-14 17:41:36 +0000146 raise error, \
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000147 "un-deep-copyable object of type %s" % type(x)
Guido van Rossum409780f1995-01-10 00:34:21 +0000148 y = copier(memo)
149 else:
150 y = copierfunction(x, memo)
151 memo[d] = y
152 return y
153
154_deepcopy_dispatch = d = {}
155
156def _deepcopy_atomic(x, memo):
157 return x
158d[types.NoneType] = _deepcopy_atomic
159d[types.IntType] = _deepcopy_atomic
160d[types.LongType] = _deepcopy_atomic
161d[types.FloatType] = _deepcopy_atomic
162d[types.StringType] = _deepcopy_atomic
163d[types.CodeType] = _deepcopy_atomic
164d[types.TypeType] = _deepcopy_atomic
165d[types.XRangeType] = _deepcopy_atomic
166
167def _deepcopy_list(x, memo):
168 y = []
169 memo[id(x)] = y
170 for a in x:
171 y.append(deepcopy(a, memo))
172 return y
173d[types.ListType] = _deepcopy_list
174
175def _deepcopy_tuple(x, memo):
176 y = []
177 for a in x:
178 y.append(deepcopy(a, memo))
179 d = id(x)
180 try:
181 return memo[d]
182 except KeyError:
183 pass
184 for i in range(len(x)):
185 if x[i] is not y[i]:
Guido van Rossum6afff611996-06-17 17:10:11 +0000186 y = tuple(y)
187 break
188 else:
189 y = x
190 memo[d] = y
191 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000192d[types.TupleType] = _deepcopy_tuple
193
194def _deepcopy_dict(x, memo):
195 y = {}
196 memo[id(x)] = y
197 for key in x.keys():
198 y[deepcopy(key, memo)] = deepcopy(x[key], memo)
199 return y
200d[types.DictionaryType] = _deepcopy_dict
201
Guido van Rossum558be281997-08-20 22:26:19 +0000202def _keep_alive(x, memo):
Guido van Rossum8ca84201998-03-26 20:56:10 +0000203 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000204
Guido van Rossum8ca84201998-03-26 20:56:10 +0000205 Because we remember objects by their id, we have
206 to assure that possibly temporary objects are kept
207 alive by referencing them.
208 We store a reference at the id of the memo, which should
209 normally not be used unless someone tries to deepcopy
210 the memo itself...
211 """
212 try:
213 memo[id(memo)].append(x)
214 except KeyError:
215 # aha, this is the first one :-)
216 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000217
Guido van Rossum409780f1995-01-10 00:34:21 +0000218def _deepcopy_inst(x, memo):
219 if hasattr(x, '__deepcopy__'):
Guido van Rossum677fc841998-03-13 20:12:17 +0000220 return x.__deepcopy__(memo)
Guido van Rossum409780f1995-01-10 00:34:21 +0000221 if hasattr(x, '__getinitargs__'):
222 args = x.__getinitargs__()
Guido van Rossum558be281997-08-20 22:26:19 +0000223 _keep_alive(args, memo)
Guido van Rossum409780f1995-01-10 00:34:21 +0000224 args = deepcopy(args, memo)
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000225 y = apply(x.__class__, args)
Guido van Rossum409780f1995-01-10 00:34:21 +0000226 else:
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000227 y = _EmptyClass()
228 y.__class__ = x.__class__
Guido van Rossum409780f1995-01-10 00:34:21 +0000229 memo[id(x)] = y
230 if hasattr(x, '__getstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000231 state = x.__getstate__()
232 _keep_alive(state, memo)
Guido van Rossum409780f1995-01-10 00:34:21 +0000233 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000234 state = x.__dict__
Guido van Rossum409780f1995-01-10 00:34:21 +0000235 state = deepcopy(state, memo)
Guido van Rossumfefbbe51995-03-22 10:10:31 +0000236 if hasattr(y, '__setstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000237 y.__setstate__(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000238 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000239 y.__dict__.update(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000240 return y
241d[types.InstanceType] = _deepcopy_inst
242
243del d
244
245del types
246
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000247# Helper for instance creation without calling __init__
248class _EmptyClass:
249 pass
250
Guido van Rossum409780f1995-01-10 00:34:21 +0000251def _test():
Guido van Rossum55d2f391995-03-14 17:41:36 +0000252 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
253 {'abc': 'ABC'}, (), [], {}]
Guido van Rossum409780f1995-01-10 00:34:21 +0000254 l1 = copy(l)
255 print l1==l
256 l1 = map(copy, l)
257 print l1==l
258 l1 = deepcopy(l)
259 print l1==l
260 class C:
261 def __init__(self, arg=None):
262 self.a = 1
263 self.arg = arg
Guido van Rossumf7cea101997-05-28 19:31:14 +0000264 if __name__ == '__main__':
265 import sys
266 file = sys.argv[0]
267 else:
268 file = __file__
269 self.fp = open(file)
Guido van Rossum409780f1995-01-10 00:34:21 +0000270 self.fp.close()
271 def __getstate__(self):
272 return {'a': self.a, 'arg': self.arg}
273 def __setstate__(self, state):
274 for key in state.keys():
275 setattr(self, key, state[key])
276 def __deepcopy__(self, memo = None):
277 new = self.__class__(deepcopy(self.arg, memo))
278 new.a = self.a
279 return new
280 c = C('argument sketch')
281 l.append(c)
282 l2 = copy(l)
283 print l == l2
284 print l
285 print l2
286 l2 = deepcopy(l)
287 print l == l2
288 print l
289 print l2
290 l.append({l[1]: l, 'xyz': l[2]})
291 l3 = copy(l)
292 import repr
293 print map(repr.repr, l)
294 print map(repr.repr, l1)
295 print map(repr.repr, l2)
296 print map(repr.repr, l3)
297 l3 = deepcopy(l)
298 import repr
299 print map(repr.repr, l)
300 print map(repr.repr, l1)
301 print map(repr.repr, l2)
302 print map(repr.repr, l3)
303
304if __name__ == '__main__':
305 _test()