14b8c6eaf8b287a27e0054cf6c751448b2077e83bGuido van Rossum"""Generic (shallow and deep) copying operations.
2409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
3cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van RossumInterface summary:
4cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
588869f9787cd4ceb2298e4b13980beb057687824Tim Peters        import copy
6cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
788869f9787cd4ceb2298e4b13980beb057687824Tim Peters        x = copy.copy(y)        # make a shallow copy of y
888869f9787cd4ceb2298e4b13980beb057687824Tim Peters        x = copy.deepcopy(y)    # make a deep copy of y
9cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
10c7557589063d07ecf8a65e88e6e396f0f750821bGuido van RossumFor module specific errors, copy.Error is raised.
11cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
12cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van RossumThe difference between shallow and deep copying is only relevant for
13cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossumcompound objects (objects that contain other objects, like lists or
14cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossumclass instances).
15cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
16cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum- A shallow copy constructs a new compound object and then (to the
17f9d88ab39ec9009e5ec989885533e542079d2426Raymond Hettinger  extent possible) inserts *the same objects* into it that the
18cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum  original contains.
19cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
20cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum- A deep copy constructs a new compound object and then, recursively,
21cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum  inserts *copies* into it of the objects found in the original.
22cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
23cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van RossumTwo problems often exist with deep copy operations that don't exist
24cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossumwith shallow copy operations:
25cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
26f7cea10f80093662b80ea82b4ca368681dd6873aGuido van Rossum a) recursive objects (compound objects that, directly or indirectly,
27cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum    contain a reference to themselves) may cause a recursive loop
28cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
29f7cea10f80093662b80ea82b4ca368681dd6873aGuido van Rossum b) because deep copy copies *everything* it may copy too much, e.g.
30cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum    administrative data structures that should be shared even between
31cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum    copies
32cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
33cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van RossumPython's deep copy operation avoids these problems by:
34cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
35f7cea10f80093662b80ea82b4ca368681dd6873aGuido van Rossum a) keeping a table of objects already copied during the current
36f7cea10f80093662b80ea82b4ca368681dd6873aGuido van Rossum    copying pass
37cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
38f7cea10f80093662b80ea82b4ca368681dd6873aGuido van Rossum b) letting user-defined classes override the copying operation or the
39cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum    set of components copied
40cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
41cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van RossumThis version does not copy types like module, class, function, method,
42cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossumnor stack trace, stack frame, nor file, socket, window, nor array, nor
43cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossumany similar types.
44cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum
45cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van RossumClasses can use the same interfaces to control copying that they use
46cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossumto control pickling: they can define methods called __getinitargs__(),
47c5d2d517000bf71c4afc1775c30d97c8d395e2b1Guido van Rossum__getstate__() and __setstate__().  See the documentation for module
48cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum"pickle" for information on these methods.
49cc6764c1ba92e947638d1c0c8fe8d312a0e3e6d4Guido van Rossum"""
50409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
51409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumimport types
52775fd66d7bd74cdedef536ff4f8c134ba718678fAntoine Pitrouimport weakref
53dffbf5f5421cbeb20237280c0bd70f989269f844Georg Brandlfrom copy_reg import dispatch_table
54409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
55227b1204681a8bd7077bf1f8e9098b7e2e9f4c13Fred Drakeclass Error(Exception):
5688869f9787cd4ceb2298e4b13980beb057687824Tim Peters    pass
5788869f9787cd4ceb2298e4b13980beb057687824Tim Peterserror = Error   # backward compatibility
58409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
59f8baad0f1759a5b26b050636fd327e874e17c5a0Guido van Rossumtry:
60f8baad0f1759a5b26b050636fd327e874e17c5a0Guido van Rossum    from org.python.core import PyStringMap
61f8baad0f1759a5b26b050636fd327e874e17c5a0Guido van Rossumexcept ImportError:
62f8baad0f1759a5b26b050636fd327e874e17c5a0Guido van Rossum    PyStringMap = None
63f8baad0f1759a5b26b050636fd327e874e17c5a0Guido van Rossum
64c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum__all__ = ["Error", "copy", "deepcopy"]
65e99d5ea25ba994491c773d9b5872332334ccd1c5Skip Montanaro
66409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdef copy(x):
6788869f9787cd4ceb2298e4b13980beb057687824Tim Peters    """Shallow copy operation on arbitrary Python objects.
6888869f9787cd4ceb2298e4b13980beb057687824Tim Peters
6988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    See the module's __doc__ string for more info.
7088869f9787cd4ceb2298e4b13980beb057687824Tim Peters    """
7188869f9787cd4ceb2298e4b13980beb057687824Tim Peters
72c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    cls = type(x)
73c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum
74c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    copier = _copy_dispatch.get(cls)
75c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    if copier:
76c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum        return copier(x)
77c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum
78c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    copier = getattr(cls, "__copy__", None)
79c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    if copier:
80c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum        return copier(x)
81c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum
82c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    reductor = dispatch_table.get(cls)
83e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum    if reductor:
84e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum        rv = reductor(x)
85e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum    else:
86e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum        reductor = getattr(x, "__reduce_ex__", None)
87e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum        if reductor:
88e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum            rv = reductor(2)
89e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum        else:
90e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum            reductor = getattr(x, "__reduce__", None)
91e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum            if reductor:
92e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                rv = reductor()
93e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum            else:
94e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                raise Error("un(shallow)copyable object of type %s" % cls)
95e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum
96e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum    return _reconstruct(x, rv, 0)
97f2715e076435b74638acb81512c2ee014f75aea2Tim Peters
98c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum
99409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum_copy_dispatch = d = {}
100409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
101f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettingerdef _copy_immutable(x):
10288869f9787cd4ceb2298e4b13980beb057687824Tim Peters    return x
103f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerfor t in (type(None), int, long, float, bool, str, tuple,
104f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettinger          frozenset, type, xrange, types.ClassType,
105b72233ce6303aabe7960170f98c5626771751fe7Raymond Hettinger          types.BuiltinFunctionType, type(Ellipsis),
106775fd66d7bd74cdedef536ff4f8c134ba718678fAntoine Pitrou          types.FunctionType, weakref.ref):
107f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettinger    d[t] = _copy_immutable
108f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettingerfor name in ("ComplexType", "UnicodeType", "CodeType"):
109f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettinger    t = getattr(types, name, None)
110f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettinger    if t is not None:
111f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettinger        d[t] = _copy_immutable
112f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettinger
113f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettingerdef _copy_with_constructor(x):
114f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettinger    return type(x)(x)
115f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettingerfor t in (list, dict, set):
116f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettinger    d[t] = _copy_with_constructor
117f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettinger
118f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettingerdef _copy_with_copy_method(x):
11988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    return x.copy()
120f8baad0f1759a5b26b050636fd327e874e17c5a0Guido van Rossumif PyStringMap is not None:
121f0e3569a28bc25cc3a6b267614b9724d8fe01a0eRaymond Hettinger    d[PyStringMap] = _copy_with_copy_method
122409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
123409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdef _copy_inst(x):
12488869f9787cd4ceb2298e4b13980beb057687824Tim Peters    if hasattr(x, '__copy__'):
12588869f9787cd4ceb2298e4b13980beb057687824Tim Peters        return x.__copy__()
12688869f9787cd4ceb2298e4b13980beb057687824Tim Peters    if hasattr(x, '__getinitargs__'):
12788869f9787cd4ceb2298e4b13980beb057687824Tim Peters        args = x.__getinitargs__()
12868468eba635570400f607e140425a222018e56f9Guido van Rossum        y = x.__class__(*args)
12988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    else:
13088869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y = _EmptyClass()
13188869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y.__class__ = x.__class__
13288869f9787cd4ceb2298e4b13980beb057687824Tim Peters    if hasattr(x, '__getstate__'):
13388869f9787cd4ceb2298e4b13980beb057687824Tim Peters        state = x.__getstate__()
13488869f9787cd4ceb2298e4b13980beb057687824Tim Peters    else:
13588869f9787cd4ceb2298e4b13980beb057687824Tim Peters        state = x.__dict__
13688869f9787cd4ceb2298e4b13980beb057687824Tim Peters    if hasattr(y, '__setstate__'):
13788869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y.__setstate__(state)
13888869f9787cd4ceb2298e4b13980beb057687824Tim Peters    else:
13988869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y.__dict__.update(state)
14088869f9787cd4ceb2298e4b13980beb057687824Tim Peters    return y
141409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumd[types.InstanceType] = _copy_inst
142409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
143409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdel d
144409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
145c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossumdef deepcopy(x, memo=None, _nil=[]):
14688869f9787cd4ceb2298e4b13980beb057687824Tim Peters    """Deep copy operation on arbitrary Python objects.
14788869f9787cd4ceb2298e4b13980beb057687824Tim Peters
14888869f9787cd4ceb2298e4b13980beb057687824Tim Peters    See the module's __doc__ string for more info.
14988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    """
15088869f9787cd4ceb2298e4b13980beb057687824Tim Peters
15188869f9787cd4ceb2298e4b13980beb057687824Tim Peters    if memo is None:
15288869f9787cd4ceb2298e4b13980beb057687824Tim Peters        memo = {}
153c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum
15488869f9787cd4ceb2298e4b13980beb057687824Tim Peters    d = id(x)
155c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    y = memo.get(d, _nil)
156c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    if y is not _nil:
157c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum        return y
158c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum
159c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    cls = type(x)
160c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum
161c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    copier = _deepcopy_dispatch.get(cls)
162c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    if copier:
163c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum        y = copier(x, memo)
164c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum    else:
16588869f9787cd4ceb2298e4b13980beb057687824Tim Peters        try:
166c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum            issc = issubclass(cls, type)
167c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum        except TypeError: # cls is not a class (old Boost; see SF #502085)
16811ade1ddc053dcec884e2431b55fb1c1727c65d7Guido van Rossum            issc = 0
16911ade1ddc053dcec884e2431b55fb1c1727c65d7Guido van Rossum        if issc:
170e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum            y = _deepcopy_atomic(x, memo)
171c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum        else:
172e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum            copier = getattr(x, "__deepcopy__", None)
173e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum            if copier:
174e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                y = copier(memo)
175e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum            else:
176e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                reductor = dispatch_table.get(cls)
177e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                if reductor:
178e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                    rv = reductor(x)
179e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                else:
180e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                    reductor = getattr(x, "__reduce_ex__", None)
181e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                    if reductor:
182e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                        rv = reductor(2)
183e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                    else:
184e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                        reductor = getattr(x, "__reduce__", None)
185e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                        if reductor:
186e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                            rv = reductor()
187e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                        else:
188e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                            raise Error(
189e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                                "un(deep)copyable object of type %s" % cls)
190e690883ccf8081e5baab0e9d71f596f26245b569Guido van Rossum                y = _reconstruct(x, rv, 1, memo)
191c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum
19288869f9787cd4ceb2298e4b13980beb057687824Tim Peters    memo[d] = y
193611546005ba27bdaf81eb14f625fde0a362ba261Guido van Rossum    _keep_alive(x, memo) # Make sure x lives at least as long as d
19488869f9787cd4ceb2298e4b13980beb057687824Tim Peters    return y
195409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
196409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum_deepcopy_dispatch = d = {}
197409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
198409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdef _deepcopy_atomic(x, memo):
19988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    return x
200f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[type(None)] = _deepcopy_atomic
201b72233ce6303aabe7960170f98c5626771751fe7Raymond Hettingerd[type(Ellipsis)] = _deepcopy_atomic
202f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[int] = _deepcopy_atomic
203f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[long] = _deepcopy_atomic
204f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[float] = _deepcopy_atomic
205f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[bool] = _deepcopy_atomic
2068b9def3aacd4b23797d58341e39a431ef128fc69Guido van Rossumtry:
207f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettinger    d[complex] = _deepcopy_atomic
208e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwisexcept NameError:
2098b9def3aacd4b23797d58341e39a431ef128fc69Guido van Rossum    pass
210f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[str] = _deepcopy_atomic
211339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwistry:
212f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettinger    d[unicode] = _deepcopy_atomic
213e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwisexcept NameError:
214339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis    pass
21588b666ca3f2e403d23c05a94fbc8038ad2c1fc4dGuido van Rossumtry:
21688b666ca3f2e403d23c05a94fbc8038ad2c1fc4dGuido van Rossum    d[types.CodeType] = _deepcopy_atomic
21788b666ca3f2e403d23c05a94fbc8038ad2c1fc4dGuido van Rossumexcept AttributeError:
21888b666ca3f2e403d23c05a94fbc8038ad2c1fc4dGuido van Rossum    pass
219f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[type] = _deepcopy_atomic
220f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[xrange] = _deepcopy_atomic
2211dca482dbdd42fc9a81cab1ae2f04471511c338dGuido van Rossumd[types.ClassType] = _deepcopy_atomic
222ba8f5ff76c8e0aa7767a9a7c59f25a2db95f5d57Martin v. Löwisd[types.BuiltinFunctionType] = _deepcopy_atomic
2231968ad32cd7f46d9bb64826672ef68cdaee35288Guido van Rossumd[types.FunctionType] = _deepcopy_atomic
224775fd66d7bd74cdedef536ff4f8c134ba718678fAntoine Pitroud[weakref.ref] = _deepcopy_atomic
225409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
226409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdef _deepcopy_list(x, memo):
22788869f9787cd4ceb2298e4b13980beb057687824Tim Peters    y = []
22888869f9787cd4ceb2298e4b13980beb057687824Tim Peters    memo[id(x)] = y
22988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    for a in x:
23088869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y.append(deepcopy(a, memo))
23188869f9787cd4ceb2298e4b13980beb057687824Tim Peters    return y
232f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[list] = _deepcopy_list
233409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
234409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdef _deepcopy_tuple(x, memo):
23588869f9787cd4ceb2298e4b13980beb057687824Tim Peters    y = []
23688869f9787cd4ceb2298e4b13980beb057687824Tim Peters    for a in x:
23788869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y.append(deepcopy(a, memo))
23888869f9787cd4ceb2298e4b13980beb057687824Tim Peters    d = id(x)
23988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    try:
24088869f9787cd4ceb2298e4b13980beb057687824Tim Peters        return memo[d]
24188869f9787cd4ceb2298e4b13980beb057687824Tim Peters    except KeyError:
24288869f9787cd4ceb2298e4b13980beb057687824Tim Peters        pass
24388869f9787cd4ceb2298e4b13980beb057687824Tim Peters    for i in range(len(x)):
24488869f9787cd4ceb2298e4b13980beb057687824Tim Peters        if x[i] is not y[i]:
24588869f9787cd4ceb2298e4b13980beb057687824Tim Peters            y = tuple(y)
24688869f9787cd4ceb2298e4b13980beb057687824Tim Peters            break
24788869f9787cd4ceb2298e4b13980beb057687824Tim Peters    else:
24888869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y = x
24988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    memo[d] = y
25088869f9787cd4ceb2298e4b13980beb057687824Tim Peters    return y
251f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[tuple] = _deepcopy_tuple
252409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
253409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdef _deepcopy_dict(x, memo):
25488869f9787cd4ceb2298e4b13980beb057687824Tim Peters    y = {}
25588869f9787cd4ceb2298e4b13980beb057687824Tim Peters    memo[id(x)] = y
256e0d4972acc8cfd4b8fb16c074a8031e50fab0f29Raymond Hettinger    for key, value in x.iteritems():
257e0d4972acc8cfd4b8fb16c074a8031e50fab0f29Raymond Hettinger        y[deepcopy(key, memo)] = deepcopy(value, memo)
25888869f9787cd4ceb2298e4b13980beb057687824Tim Peters    return y
259f715366f23f47832a4b9914c54d5a63b19f17ebaRaymond Hettingerd[dict] = _deepcopy_dict
260f8baad0f1759a5b26b050636fd327e874e17c5a0Guido van Rossumif PyStringMap is not None:
261f8baad0f1759a5b26b050636fd327e874e17c5a0Guido van Rossum    d[PyStringMap] = _deepcopy_dict
262409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
263d16f57bf4db4417c8d7a038a0b61bb24461cd64aAntoine Pitroudef _deepcopy_method(x, memo): # Copy instance methods
264d16f57bf4db4417c8d7a038a0b61bb24461cd64aAntoine Pitrou    return type(x)(x.im_func, deepcopy(x.im_self, memo), x.im_class)
265d16f57bf4db4417c8d7a038a0b61bb24461cd64aAntoine Pitrou_deepcopy_dispatch[types.MethodType] = _deepcopy_method
266d16f57bf4db4417c8d7a038a0b61bb24461cd64aAntoine Pitrou
267558be283bf2c3a2c405c8a404da1cfed69900226Guido van Rossumdef _keep_alive(x, memo):
26888869f9787cd4ceb2298e4b13980beb057687824Tim Peters    """Keeps a reference to the object x in the memo.
26988869f9787cd4ceb2298e4b13980beb057687824Tim Peters
27088869f9787cd4ceb2298e4b13980beb057687824Tim Peters    Because we remember objects by their id, we have
27188869f9787cd4ceb2298e4b13980beb057687824Tim Peters    to assure that possibly temporary objects are kept
27288869f9787cd4ceb2298e4b13980beb057687824Tim Peters    alive by referencing them.
27388869f9787cd4ceb2298e4b13980beb057687824Tim Peters    We store a reference at the id of the memo, which should
27488869f9787cd4ceb2298e4b13980beb057687824Tim Peters    normally not be used unless someone tries to deepcopy
27588869f9787cd4ceb2298e4b13980beb057687824Tim Peters    the memo itself...
27688869f9787cd4ceb2298e4b13980beb057687824Tim Peters    """
27788869f9787cd4ceb2298e4b13980beb057687824Tim Peters    try:
27888869f9787cd4ceb2298e4b13980beb057687824Tim Peters        memo[id(memo)].append(x)
27988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    except KeyError:
28088869f9787cd4ceb2298e4b13980beb057687824Tim Peters        # aha, this is the first one :-)
28188869f9787cd4ceb2298e4b13980beb057687824Tim Peters        memo[id(memo)]=[x]
282558be283bf2c3a2c405c8a404da1cfed69900226Guido van Rossum
283409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdef _deepcopy_inst(x, memo):
28488869f9787cd4ceb2298e4b13980beb057687824Tim Peters    if hasattr(x, '__deepcopy__'):
28588869f9787cd4ceb2298e4b13980beb057687824Tim Peters        return x.__deepcopy__(memo)
28688869f9787cd4ceb2298e4b13980beb057687824Tim Peters    if hasattr(x, '__getinitargs__'):
28788869f9787cd4ceb2298e4b13980beb057687824Tim Peters        args = x.__getinitargs__()
28888869f9787cd4ceb2298e4b13980beb057687824Tim Peters        args = deepcopy(args, memo)
28968468eba635570400f607e140425a222018e56f9Guido van Rossum        y = x.__class__(*args)
29088869f9787cd4ceb2298e4b13980beb057687824Tim Peters    else:
29188869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y = _EmptyClass()
29288869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y.__class__ = x.__class__
29388869f9787cd4ceb2298e4b13980beb057687824Tim Peters    memo[id(x)] = y
29488869f9787cd4ceb2298e4b13980beb057687824Tim Peters    if hasattr(x, '__getstate__'):
29588869f9787cd4ceb2298e4b13980beb057687824Tim Peters        state = x.__getstate__()
29688869f9787cd4ceb2298e4b13980beb057687824Tim Peters    else:
29788869f9787cd4ceb2298e4b13980beb057687824Tim Peters        state = x.__dict__
29888869f9787cd4ceb2298e4b13980beb057687824Tim Peters    state = deepcopy(state, memo)
29988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    if hasattr(y, '__setstate__'):
30088869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y.__setstate__(state)
30188869f9787cd4ceb2298e4b13980beb057687824Tim Peters    else:
30288869f9787cd4ceb2298e4b13980beb057687824Tim Peters        y.__dict__.update(state)
30388869f9787cd4ceb2298e4b13980beb057687824Tim Peters    return y
304409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumd[types.InstanceType] = _deepcopy_inst
305409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
3061e91c1444a9c8b8b58310cffbe4252698527a31eGuido van Rossumdef _reconstruct(x, info, deep, memo=None):
3076cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum    if isinstance(info, str):
3086cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum        return x
3096cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum    assert isinstance(info, tuple)
3101e91c1444a9c8b8b58310cffbe4252698527a31eGuido van Rossum    if memo is None:
3111e91c1444a9c8b8b58310cffbe4252698527a31eGuido van Rossum        memo = {}
3126cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum    n = len(info)
31390e05b0e25a3e69d23054c5f05cbe5b6ec475ca5Guido van Rossum    assert n in (2, 3, 4, 5)
3146cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum    callable, args = info[:2]
3156cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum    if n > 2:
3166cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum        state = info[2]
3176cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum    else:
3182329eeda0cabfda89e915e9a571a229707602963Serhiy Storchaka        state = None
31990e05b0e25a3e69d23054c5f05cbe5b6ec475ca5Guido van Rossum    if n > 3:
32090e05b0e25a3e69d23054c5f05cbe5b6ec475ca5Guido van Rossum        listiter = info[3]
32190e05b0e25a3e69d23054c5f05cbe5b6ec475ca5Guido van Rossum    else:
32290e05b0e25a3e69d23054c5f05cbe5b6ec475ca5Guido van Rossum        listiter = None
32390e05b0e25a3e69d23054c5f05cbe5b6ec475ca5Guido van Rossum    if n > 4:
32490e05b0e25a3e69d23054c5f05cbe5b6ec475ca5Guido van Rossum        dictiter = info[4]
32590e05b0e25a3e69d23054c5f05cbe5b6ec475ca5Guido van Rossum    else:
32690e05b0e25a3e69d23054c5f05cbe5b6ec475ca5Guido van Rossum        dictiter = None
3276cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum    if deep:
3281e91c1444a9c8b8b58310cffbe4252698527a31eGuido van Rossum        args = deepcopy(args, memo)
3296cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum    y = callable(*args)
33099d2c251df4782c52c3e1cb89064374af39ecb46Guido van Rossum    memo[id(x)] = y
331dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou
3322329eeda0cabfda89e915e9a571a229707602963Serhiy Storchaka    if state is not None:
3336cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum        if deep:
3341e91c1444a9c8b8b58310cffbe4252698527a31eGuido van Rossum            state = deepcopy(state, memo)
3353e3583c345e35d72a394f751bbee33257880fbd4Guido van Rossum        if hasattr(y, '__setstate__'):
3363e3583c345e35d72a394f751bbee33257880fbd4Guido van Rossum            y.__setstate__(state)
3373e3583c345e35d72a394f751bbee33257880fbd4Guido van Rossum        else:
338c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum            if isinstance(state, tuple) and len(state) == 2:
339c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum                state, slotstate = state
340c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum            else:
341c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum                slotstate = None
342c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum            if state is not None:
343c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum                y.__dict__.update(state)
344c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum            if slotstate is not None:
345c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum                for key, value in slotstate.iteritems():
346c7557589063d07ecf8a65e88e6e396f0f750821bGuido van Rossum                    setattr(y, key, value)
347dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou
348dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou    if listiter is not None:
349dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou        for item in listiter:
350dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou            if deep:
351dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou                item = deepcopy(item, memo)
352dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou            y.append(item)
353dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou    if dictiter is not None:
354dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou        for key, value in dictiter:
355dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou            if deep:
356dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou                key = deepcopy(key, memo)
357dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou                value = deepcopy(value, memo)
358dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou            y[key] = value
3596cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum    return y
3606cef6d5d62f083ada715da3610ce12147b625ee2Guido van Rossum
361409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdel d
362409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
363409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdel types
364409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
365c5d2d517000bf71c4afc1775c30d97c8d395e2b1Guido van Rossum# Helper for instance creation without calling __init__
366c5d2d517000bf71c4afc1775c30d97c8d395e2b1Guido van Rossumclass _EmptyClass:
367c5d2d517000bf71c4afc1775c30d97c8d395e2b1Guido van Rossum    pass
368c5d2d517000bf71c4afc1775c30d97c8d395e2b1Guido van Rossum
369409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumdef _test():
37088869f9787cd4ceb2298e4b13980beb057687824Tim Peters    l = [None, 1, 2L, 3.14, 'xyzzy', (1, 2L), [3.14, 'abc'],
37188869f9787cd4ceb2298e4b13980beb057687824Tim Peters         {'abc': 'ABC'}, (), [], {}]
37288869f9787cd4ceb2298e4b13980beb057687824Tim Peters    l1 = copy(l)
37388869f9787cd4ceb2298e4b13980beb057687824Tim Peters    print l1==l
37488869f9787cd4ceb2298e4b13980beb057687824Tim Peters    l1 = map(copy, l)
37588869f9787cd4ceb2298e4b13980beb057687824Tim Peters    print l1==l
37688869f9787cd4ceb2298e4b13980beb057687824Tim Peters    l1 = deepcopy(l)
37788869f9787cd4ceb2298e4b13980beb057687824Tim Peters    print l1==l
37888869f9787cd4ceb2298e4b13980beb057687824Tim Peters    class C:
37988869f9787cd4ceb2298e4b13980beb057687824Tim Peters        def __init__(self, arg=None):
38088869f9787cd4ceb2298e4b13980beb057687824Tim Peters            self.a = 1
38188869f9787cd4ceb2298e4b13980beb057687824Tim Peters            self.arg = arg
38288869f9787cd4ceb2298e4b13980beb057687824Tim Peters            if __name__ == '__main__':
38388869f9787cd4ceb2298e4b13980beb057687824Tim Peters                import sys
38488869f9787cd4ceb2298e4b13980beb057687824Tim Peters                file = sys.argv[0]
38588869f9787cd4ceb2298e4b13980beb057687824Tim Peters            else:
38688869f9787cd4ceb2298e4b13980beb057687824Tim Peters                file = __file__
38788869f9787cd4ceb2298e4b13980beb057687824Tim Peters            self.fp = open(file)
38888869f9787cd4ceb2298e4b13980beb057687824Tim Peters            self.fp.close()
38988869f9787cd4ceb2298e4b13980beb057687824Tim Peters        def __getstate__(self):
39088869f9787cd4ceb2298e4b13980beb057687824Tim Peters            return {'a': self.a, 'arg': self.arg}
39188869f9787cd4ceb2298e4b13980beb057687824Tim Peters        def __setstate__(self, state):
392e0d4972acc8cfd4b8fb16c074a8031e50fab0f29Raymond Hettinger            for key, value in state.iteritems():
393e0d4972acc8cfd4b8fb16c074a8031e50fab0f29Raymond Hettinger                setattr(self, key, value)
394c06e3acc735a6e9cf28d0f511493bcfd8829117dGuido van Rossum        def __deepcopy__(self, memo=None):
39588869f9787cd4ceb2298e4b13980beb057687824Tim Peters            new = self.__class__(deepcopy(self.arg, memo))
39688869f9787cd4ceb2298e4b13980beb057687824Tim Peters            new.a = self.a
39788869f9787cd4ceb2298e4b13980beb057687824Tim Peters            return new
39888869f9787cd4ceb2298e4b13980beb057687824Tim Peters    c = C('argument sketch')
39988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    l.append(c)
40088869f9787cd4ceb2298e4b13980beb057687824Tim Peters    l2 = copy(l)
40188869f9787cd4ceb2298e4b13980beb057687824Tim Peters    print l == l2
40288869f9787cd4ceb2298e4b13980beb057687824Tim Peters    print l
40388869f9787cd4ceb2298e4b13980beb057687824Tim Peters    print l2
40488869f9787cd4ceb2298e4b13980beb057687824Tim Peters    l2 = deepcopy(l)
40588869f9787cd4ceb2298e4b13980beb057687824Tim Peters    print l == l2
40688869f9787cd4ceb2298e4b13980beb057687824Tim Peters    print l
40788869f9787cd4ceb2298e4b13980beb057687824Tim Peters    print l2
40888869f9787cd4ceb2298e4b13980beb057687824Tim Peters    l.append({l[1]: l, 'xyz': l[2]})
40988869f9787cd4ceb2298e4b13980beb057687824Tim Peters    l3 = copy(l)
4102ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannon    import repr
4112ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannon    print map(repr.repr, l)
4122ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannon    print map(repr.repr, l1)
4132ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannon    print map(repr.repr, l2)
4142ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannon    print map(repr.repr, l3)
41588869f9787cd4ceb2298e4b13980beb057687824Tim Peters    l3 = deepcopy(l)
4162ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannon    import repr
4172ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannon    print map(repr.repr, l)
4182ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannon    print map(repr.repr, l1)
4192ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannon    print map(repr.repr, l2)
4202ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannon    print map(repr.repr, l3)
421dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou    class odict(dict):
422dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou        def __init__(self, d = {}):
423dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou            self.a = 99
424dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou            dict.__init__(self, d)
425dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou        def __setitem__(self, k, i):
426dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou            dict.__setitem__(self, k, i)
427dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou            self.a
428dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou    o = odict({"A" : "B"})
429dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou    x = deepcopy(o)
430dca9de97b4256c8aad8a423d6f1d889d2bae9b3dAntoine Pitrou    print(o, x)
431409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossum
432409780f8f27c6c80481d7c6f62eb8bcbd132c47eGuido van Rossumif __name__ == '__main__':
43388869f9787cd4ceb2298e4b13980beb057687824Tim Peters    _test()
434