]> granicus.if.org Git - python/commitdiff
Fix for SF bug ##497426: can't deepcopy recursive new objects
authorGuido van Rossum <guido@python.org>
Fri, 28 Dec 2001 21:33:22 +0000 (21:33 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 28 Dec 2001 21:33:22 +0000 (21:33 +0000)
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

index 14eff057345c6e56ea335281f57c217596dfcb34..86fc978e71a3bf713544a27a76ccc79f1e30c1b3 100644 (file)
@@ -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