Problem with OrderedDict - progress report

Frank Millman frank at chagford.com
Thu May 31 10:37:39 EDT 2018


"Steven D'Aprano"  wrote in message news:peorib$1f4$2 at blaine.gmane.org...
>
> On Thu, 31 May 2018 10:05:43 +0200, Frank Millman wrote:
>
> > From the interpreter session below, you will see that adding a key while
> > processing the *last* key in an OrderedDict does not give rise to an
> > exception.
>
> If you mutate the dict, and then stop iterating over it, there is no
> check that the dict was mutated.
>
> It isn't an error to mutate the dict. It is an error to mutate it while
> it is being iterated over. If you stop the iteration, there's no problem.
>

Agreed, but my gut feel, and the following example, suggest that when 
processing the last key in a dictionary while iterating over it, you have 
not yet stopped iterating.

>>> d = {}
>>> d[1] = 'one'
>>> d[2] = 'two'
>>> for k in d:
...   if k == 2:
...     d[3] = 'three'
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
>>>

OrderedDict seems to behave differently in this regard -

>>> from collections import OrderedDict as OD
>>> d = OD()
>>> d[1] = 'one'
>>> d[2] = 'two'
>>> for k in d:
...   if k == 2:
...     d[3] = 'three'
...
>>> d
OrderedDict([(1, 'one'), (2, 'two'), (3, 'three')])
>>>

Frank






More information about the Python-list mailing list