Issue #1100562: Fix deep-copying of objects derived from the list and dict types.
Patch by Michele Orrù and Björn Lindqvist.
diff --git a/Lib/copy.py b/Lib/copy.py
index 789488c..07f1d23 100644
--- a/Lib/copy.py
+++ b/Lib/copy.py
@@ -283,17 +283,7 @@
         args = deepcopy(args, memo)
     y = callable(*args)
     memo[id(x)] = y
-    if listiter is not None:
-        for item in listiter:
-            if deep:
-                item = deepcopy(item, memo)
-            y.append(item)
-    if dictiter is not None:
-        for key, value in dictiter:
-            if deep:
-                key = deepcopy(key, memo)
-                value = deepcopy(value, memo)
-            y[key] = value
+
     if state:
         if deep:
             state = deepcopy(state, memo)
@@ -309,6 +299,18 @@
             if slotstate is not None:
                 for key, value in slotstate.items():
                     setattr(y, key, value)
+
+    if listiter is not None:
+        for item in listiter:
+            if deep:
+                item = deepcopy(item, memo)
+            y.append(item)
+    if dictiter is not None:
+        for key, value in dictiter:
+            if deep:
+                key = deepcopy(key, memo)
+                value = deepcopy(value, memo)
+            y[key] = value
     return y
 
 del d
@@ -370,6 +372,16 @@
     print(map(reprlib.repr, l1))
     print(map(reprlib.repr, l2))
     print(map(reprlib.repr, l3))
+    class odict(dict):
+        def __init__(self, d = {}):
+            self.a = 99
+            dict.__init__(self, d)
+        def __setitem__(self, k, i):
+            dict.__setitem__(self, k, i)
+            self.a
+    o = odict({"A" : "B"})
+    x = deepcopy(o)
+    print(o, x)
 
 if __name__ == '__main__':
     _test()