From 1e91c1444a9c8b8b58310cffbe4252698527a31e Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 28 Dec 2001 21:33:22 +0000 Subject: [PATCH] Fix for SF bug ##497426: can't deepcopy recursive new objects deepcopy(), _reconstruct(): pass the memo to the other function, so that recursive data structures built out of new-style objects may be deeply copied correctly. 2.2.1 bugfix! --- Lib/copy.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Lib/copy.py b/Lib/copy.py index 14eff05734..86fc978e71 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -172,7 +172,7 @@ def deepcopy(x, memo = None): raise error, \ "un-deep-copyable object of type %s" % type(x) else: - y = _reconstruct(x, reductor(), 1) + y = _reconstruct(x, reductor(), 1, memo) else: y = copier(memo) else: @@ -279,10 +279,12 @@ def _deepcopy_inst(x, memo): return y d[types.InstanceType] = _deepcopy_inst -def _reconstruct(x, info, deep): +def _reconstruct(x, info, deep, memo=None): if isinstance(info, str): return x assert isinstance(info, tuple) + if memo is None: + memo = {} n = len(info) assert n in (2, 3) callable, args = info[:2] @@ -291,11 +293,11 @@ def _reconstruct(x, info, deep): else: state = {} if deep: - args = deepcopy(args) + args = deepcopy(args, memo) y = callable(*args) if state: if deep: - state = deepcopy(state) + state = deepcopy(state, memo) y.__dict__.update(state) return y -- 2.50.1