修改 python 中的字典时出现意外行为
Unexpected behavior while modifying the dictionary in python
我试图在遍历字典对象的同时对其进行修改。但是 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'
我认为原因是弹出项目后,for
循环在尝试移动到下一个键值时失败。换句话说,错误发生在删除键值对之后。查看答案 here.
创建字典的副本并让 gc
完成剩下的工作可能更好。
b = {k:v for k,v in a.items() if k%2 != 0}
我试图在遍历字典对象的同时对其进行修改。但是 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'
我认为原因是弹出项目后,for
循环在尝试移动到下一个键值时失败。换句话说,错误发生在删除键值对之后。查看答案 here.
创建字典的副本并让 gc
完成剩下的工作可能更好。
b = {k:v for k,v in a.items() if k%2 != 0}