修改 python 中的字典时出现意外行为

Unexpected behavior while modifying the dictionary in python

我试图在遍历字典对象的同时对其进行修改。但是 python 会提出一个 RuntimeErrordictionary 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'

我认为原因是弹出项目后,for 循环在尝试移动到下一个键值时失败。换句话说,错误发生在删除键值对之后。查看答案 here.

创建字典的副本并让 gc 完成剩下的工作可能更好。

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