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