diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index dbe30dff1fe..c363987970b 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -986,6 +986,8 @@ class MutableSequence(Sequence): def extend(self, values): 'S.extend(iterable) -- extend sequence by appending elements from the iterable' + if values is self: + values = list(values) for v in values: self.append(v) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 2099d236d0c..0b7cb5848b1 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -1721,6 +1721,18 @@ class TestCollectionABCs(ABCTestCase): mss.clear() self.assertEqual(len(mss), 0) + # issue 34427 + # extending self should not cause infinite loop + items = 'ABCD' + mss2 = MutableSequenceSubclass() + mss2.extend(items + items) + mss.clear() + mss.extend(items) + mss.extend(mss) + self.assertEqual(len(mss), len(mss2)) + self.assertEqual(list(mss), list(mss2)) + + ################################################################################ ### Counter ################################################################################ diff --git a/Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst b/Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst new file mode 100644 index 00000000000..f6e0e030b7f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst @@ -0,0 +1 @@ +Fix infinite loop in ``a.extend(a)`` for ``MutableSequence`` subclasses.