Chris Green wrote: >> >1 - Why doesn't it error in Python 2? >> >> The dict internal implementation has changed. I don't know the >> specifics, but it is now faster and maybe smaller and also now preserves >> insert order. >> > Ah, that probably explains it then.
But if you try to modify a dict while you iterate over it in py2 you trigger the same error: $ python Python 2.7.6 (default, Nov 13 2018, 12:45:42) [GCC 4.8.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> d = dict(a=1) >>> for k in d: del d["a"] ... Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: dictionary changed size during iteration If you look at the 2.7 mailbox code you'll find that the iteritems() method delegates to iterkeys() which in turn uses keys(), not iterkeys() as one might expect, for key in self._toc.keys(): yield key of the underlying _toc dict, and in py2 keys() creates a list of keys. In py3 the above loop becomes yield from self._toc.keys() but in py3 the keys() method returns a view on the underlying dict. -- https://mail.python.org/mailman/listinfo/python-list