Неожиданное поведение при изменении словаря в python - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь изменить объект словаря, перебирая его. Но python вызовет RuntimeError, сказав, что dictionary changed size during iteration, чтобы избежать неожиданного поведения (это ожидается).

>>> a = {1: 2, 2: 3}
>>> for key in a:
...     if key % 2 == 0:
...             a.pop(key)
...
3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

Но что на самом деле меня удивило, так это то, что вышеприведенный кодовый блок завершился с RuntimeError словарь a изменился.

>>> a
{1: 2}

Почему это так? Это поведение где-то задокументировано?.

Ниже моя python версия и реализация.

>>> import sys, platform
>>> sys.version_info
sys.version_info(major=3, minor=8, micro=0, releaselevel='final', serial=0)
>>> platform.python_implementation()
'CPython'

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Я полагаю, что причина в том, что после выталкивания элемента, for l oop завершается неудачно при попытке перейти к следующему значению ключа. Другими словами, ошибка возникает после удаления пары ключ-значение. Смотрите ответы здесь.

0 голосов
/ 20 февраля 2020

Вероятно, лучше создать копию диктанта, а gc сделает все остальное.

b = {k:v for k,v in a.items() if k%2 != 0}
...