d[dict] = _deepcopy_dict
def _deepcopy_frozendict(x, memo, deepcopy=deepcopy):
- y = _deepcopy_dict(x, memo, deepcopy)
+ y = {}
+ for key, value in x.items():
+ y[deepcopy(key, memo)] = deepcopy(value, memo)
+
+ # We're not going to put the frozendict in the memo, but it's still
+ # important we check for it, in case the frozendict contains recursive
+ # mutable structures.
+ try:
+ return memo[id(x)]
+ except KeyError:
+ pass
return frozendict(y)
d[frozendict] = _deepcopy_frozendict
self.assertIsNot(x, y)
self.assertIsNot(x["foo"], y["foo"])
+ # recursive frozendict
+ x = frozendict(foo=[])
+ x['foo'].append(x)
+ y = copy.deepcopy(x)
+ self.assertEqual(y.keys(), x.keys())
+ self.assertIsNot(x, y)
+ self.assertIsNot(x["foo"], y["foo"])
+ self.assertIs(y['foo'][0], y)
+
+ x = frozendict(foo=[])
+ x['foo'].append(x)
+ x = x['foo']
+ y = copy.deepcopy(x)
+ self.assertIsNot(x, y)
+ self.assertIsNot(x[0], y[0])
+ self.assertIs(y[0]['foo'], y)
+
@support.skip_emscripten_stack_overflow()
@support.skip_wasi_stack_overflow()
def test_deepcopy_reflexive_dict(self):