blob: e4679deca2abf428a07da3416cb9559a036182d9 [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
Guido van Rossum55d2f391995-03-14 17:41:36 +000055error = 'copy.error'
56Error = error # backward compatibility
Guido van Rossum409780f1995-01-10 00:34:21 +000057
58def copy(x):
Guido van Rossumcc6764c1995-02-09 17:18:10 +000059 """Shallow copy operation on arbitrary Python objects.
60
61 See the module's __doc__ string for more info.
62 """
63
Guido van Rossum409780f1995-01-10 00:34:21 +000064 try:
65 copierfunction = _copy_dispatch[type(x)]
66 except KeyError:
67 try:
68 copier = x.__copy__
69 except AttributeError:
Guido van Rossum55d2f391995-03-14 17:41:36 +000070 raise error, \
Guido van Rossumcc6764c1995-02-09 17:18:10 +000071 "un(shallow)copyable object of type %s" % type(x)
Guido van Rossum409780f1995-01-10 00:34:21 +000072 y = copier()
73 else:
74 y = copierfunction(x)
75 return y
76
77_copy_dispatch = d = {}
78
79def _copy_atomic(x):
80 return x
81d[types.NoneType] = _copy_atomic
82d[types.IntType] = _copy_atomic
83d[types.LongType] = _copy_atomic
84d[types.FloatType] = _copy_atomic
85d[types.StringType] = _copy_atomic
Guido van Rossum2fff84d1999-01-25 21:37:02 +000086try:
87 d[types.CodeType] = _copy_atomic
88except AttributeError:
89 pass
Guido van Rossum409780f1995-01-10 00:34:21 +000090d[types.TypeType] = _copy_atomic
91d[types.XRangeType] = _copy_atomic
Guido van Rossum55d2f391995-03-14 17:41:36 +000092d[types.ClassType] = _copy_atomic
Guido van Rossum409780f1995-01-10 00:34:21 +000093
94def _copy_list(x):
95 return x[:]
96d[types.ListType] = _copy_list
97
98def _copy_tuple(x):
99 return x[:]
100d[types.TupleType] = _copy_tuple
101
102def _copy_dict(x):
Guido van Rossumf7cea101997-05-28 19:31:14 +0000103 return x.copy()
Guido van Rossum409780f1995-01-10 00:34:21 +0000104d[types.DictionaryType] = _copy_dict
105
106def _copy_inst(x):
107 if hasattr(x, '__copy__'):
108 return x.__copy__()
109 if hasattr(x, '__getinitargs__'):
110 args = x.__getinitargs__()
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000111 y = apply(x.__class__, args)
Guido van Rossum409780f1995-01-10 00:34:21 +0000112 else:
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000113 y = _EmptyClass()
114 y.__class__ = x.__class__
Guido van Rossum409780f1995-01-10 00:34:21 +0000115 if hasattr(x, '__getstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000116 state = x.__getstate__()
Guido van Rossum409780f1995-01-10 00:34:21 +0000117 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000118 state = x.__dict__
Guido van Rossumfefbbe51995-03-22 10:10:31 +0000119 if hasattr(y, '__setstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000120 y.__setstate__(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000121 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000122 y.__dict__.update(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000123 return y
124d[types.InstanceType] = _copy_inst
125
126del d
127
128def deepcopy(x, memo = None):
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000129 """Deep copy operation on arbitrary Python objects.
130
131 See the module's __doc__ string for more info.
132 """
133
Guido van Rossum409780f1995-01-10 00:34:21 +0000134 if memo is None:
135 memo = {}
136 d = id(x)
137 if memo.has_key(d):
138 return memo[d]
139 try:
140 copierfunction = _deepcopy_dispatch[type(x)]
141 except KeyError:
142 try:
143 copier = x.__deepcopy__
144 except AttributeError:
Guido van Rossum55d2f391995-03-14 17:41:36 +0000145 raise error, \
Guido van Rossumcc6764c1995-02-09 17:18:10 +0000146 "un-deep-copyable object of type %s" % type(x)
Guido van Rossum409780f1995-01-10 00:34:21 +0000147 y = copier(memo)
148 else:
149 y = copierfunction(x, memo)
150 memo[d] = y
151 return y
152
153_deepcopy_dispatch = d = {}
154
155def _deepcopy_atomic(x, memo):
156 return x
157d[types.NoneType] = _deepcopy_atomic
158d[types.IntType] = _deepcopy_atomic
159d[types.LongType] = _deepcopy_atomic
160d[types.FloatType] = _deepcopy_atomic
161d[types.StringType] = _deepcopy_atomic
162d[types.CodeType] = _deepcopy_atomic
163d[types.TypeType] = _deepcopy_atomic
164d[types.XRangeType] = _deepcopy_atomic
165
166def _deepcopy_list(x, memo):
167 y = []
168 memo[id(x)] = y
169 for a in x:
170 y.append(deepcopy(a, memo))
171 return y
172d[types.ListType] = _deepcopy_list
173
174def _deepcopy_tuple(x, memo):
175 y = []
176 for a in x:
177 y.append(deepcopy(a, memo))
178 d = id(x)
179 try:
180 return memo[d]
181 except KeyError:
182 pass
183 for i in range(len(x)):
184 if x[i] is not y[i]:
Guido van Rossum6afff611996-06-17 17:10:11 +0000185 y = tuple(y)
186 break
187 else:
188 y = x
189 memo[d] = y
190 return y
Guido van Rossum409780f1995-01-10 00:34:21 +0000191d[types.TupleType] = _deepcopy_tuple
192
193def _deepcopy_dict(x, memo):
194 y = {}
195 memo[id(x)] = y
196 for key in x.keys():
197 y[deepcopy(key, memo)] = deepcopy(x[key], memo)
198 return y
199d[types.DictionaryType] = _deepcopy_dict
200
Guido van Rossum558be281997-08-20 22:26:19 +0000201def _keep_alive(x, memo):
Guido van Rossum8ca84201998-03-26 20:56:10 +0000202 """Keeps a reference to the object x in the memo.
Guido van Rossum558be281997-08-20 22:26:19 +0000203
Guido van Rossum8ca84201998-03-26 20:56:10 +0000204 Because we remember objects by their id, we have
205 to assure that possibly temporary objects are kept
206 alive by referencing them.
207 We store a reference at the id of the memo, which should
208 normally not be used unless someone tries to deepcopy
209 the memo itself...
210 """
211 try:
212 memo[id(memo)].append(x)
213 except KeyError:
214 # aha, this is the first one :-)
215 memo[id(memo)]=[x]
Guido van Rossum558be281997-08-20 22:26:19 +0000216
Guido van Rossum409780f1995-01-10 00:34:21 +0000217def _deepcopy_inst(x, memo):
218 if hasattr(x, '__deepcopy__'):
Guido van Rossum677fc841998-03-13 20:12:17 +0000219 return x.__deepcopy__(memo)
Guido van Rossum409780f1995-01-10 00:34:21 +0000220 if hasattr(x, '__getinitargs__'):
221 args = x.__getinitargs__()
Guido van Rossum558be281997-08-20 22:26:19 +0000222 _keep_alive(args, memo)
Guido van Rossum409780f1995-01-10 00:34:21 +0000223 args = deepcopy(args, memo)
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000224 y = apply(x.__class__, args)
Guido van Rossum409780f1995-01-10 00:34:21 +0000225 else:
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000226 y = _EmptyClass()
227 y.__class__ = x.__class__
Guido van Rossum409780f1995-01-10 00:34:21 +0000228 memo[id(x)] = y
229 if hasattr(x, '__getstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000230 state = x.__getstate__()
231 _keep_alive(state, memo)
Guido van Rossum409780f1995-01-10 00:34:21 +0000232 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000233 state = x.__dict__
Guido van Rossum409780f1995-01-10 00:34:21 +0000234 state = deepcopy(state, memo)
Guido van Rossumfefbbe51995-03-22 10:10:31 +0000235 if hasattr(y, '__setstate__'):
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000236 y.__setstate__(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000237 else:
Guido van Rossume6eef4b1997-10-26 17:00:25 +0000238 y.__dict__.update(state)
Guido van Rossum409780f1995-01-10 00:34:21 +0000239 return y
240d[types.InstanceType] = _deepcopy_inst
241
242del d
243
244del types
245
Guido van Rossumc5d2d511997-12-07 16:18:22 +0000246# Helper for instance creation without calling __init__
247class _EmptyClass:
248 pass
249
Guido van Rossum409780f1995-01-10 00:34:21 +0000250def _test():
Guido van Rossum55d2f391995-03-14 17:41:36 +0000251 l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
252 {'abc': 'ABC'}, (), [], {}]
Guido van Rossum409780f1995-01-10 00:34:21 +0000253 l1 = copy(l)
254 print l1==l
255 l1 = map(copy, l)
256 print l1==l
257 l1 = deepcopy(l)
258 print l1==l
259 class C:
260 def __init__(self, arg=None):
261 self.a = 1
262 self.arg = arg
Guido van Rossumf7cea101997-05-28 19:31:14 +0000263 if __name__ == '__main__':
264 import sys
265 file = sys.argv[0]
266 else:
267 file = __file__
268 self.fp = open(file)
Guido van Rossum409780f1995-01-10 00:34:21 +0000269 self.fp.close()
270 def __getstate__(self):
271 return {'a': self.a, 'arg': self.arg}
272 def __setstate__(self, state):
273 for key in state.keys():
274 setattr(self, key, state[key])
275 def __deepcopy__(self, memo = None):
276 new = self.__class__(deepcopy(self.arg, memo))
277 new.a = self.a
278 return new
279 c = C('argument sketch')
280 l.append(c)
281 l2 = copy(l)
282 print l == l2
283 print l
284 print l2
285 l2 = deepcopy(l)
286 print l == l2
287 print l
288 print l2
289 l.append({l[1]: l, 'xyz': l[2]})
290 l3 = copy(l)
291 import repr
292 print map(repr.repr, l)
293 print map(repr.repr, l1)
294 print map(repr.repr, l2)
295 print map(repr.repr, l3)
296 l3 = deepcopy(l)
297 import repr
298 print map(repr.repr, l)
299 print map(repr.repr, l1)
300 print map(repr.repr, l2)
301 print map(repr.repr, l3)
302
303if __name__ == '__main__':
304 _test()