diff -r b7a4c076ba40 Lib/_collections_abc.py --- a/Lib/_collections_abc.py Tue Jun 07 01:08:48 2016 +0000 +++ b/Lib/_collections_abc.py Tue Jun 07 20:27:35 2016 +0300 @@ -671,6 +671,15 @@ class KeysView(MappingView, Set): def __iter__(self): yield from self._mapping + def __deepcopy__(self, memo): + from copy import deepcopy + y = {deepcopy(key, memo) for key in self} + try: + return memo[id(self)] + except KeyError: + pass + return frozenset(y) + KeysView.register(dict_keys) @@ -713,6 +722,15 @@ class ValuesView(MappingView): for key in self._mapping: yield self._mapping[key] + def __deepcopy__(self, memo): + from copy import deepcopy + y = [deepcopy(value, memo) for value in self] + try: + return memo[id(self)] + except KeyError: + pass + return tuple(y) + ValuesView.register(dict_values) diff -r b7a4c076ba40 Lib/test/test_copy.py --- a/Lib/test/test_copy.py Tue Jun 07 01:08:48 2016 +0000 +++ b/Lib/test/test_copy.py Tue Jun 07 20:27:35 2016 +0300 @@ -1,5 +1,6 @@ """Unit tests for the copy module.""" +import collections.abc import copy import copyreg import weakref @@ -424,6 +425,25 @@ class TestCopy(unittest.TestCase): self.assertIs(y['foo'], y) self.assertEqual(len(y), 1) + def test_deepcopy_KeysView(self): + d = {'foo': [1, 2], 3: memoryview(b'bar')} + x = collections.abc.KeysView(d) + y = copy.deepcopy(x) + self.assertEqual(y, {'foo', 3}) + self.assertIsInstance(y, collections.abc.Set) + self.assertIn('foo', y) + del d['foo'] + self.assertIn('foo', y) + + def test_deepcopy_ValuesView(self): + d = {'foo': [1, 2], memoryview(b'bar'): 3} + x = collections.abc.ValuesView(d) + y = copy.deepcopy(x) + self.assertCountEqual(y, ([1, 2], 3)) + self.assertIn([1, 2], y) + del d['foo'] + self.assertIn([1, 2], y) + def test_deepcopy_keepalive(self): memo = {} x = []