← 中文资源

简体中文版本

Python RuntimeError: 迭代期间字典大小改变

修复迭代字典或集合时修改它导致的 RuntimeError,并选择遍历副本、list(d) 或延迟删除等方案。

阅读英文原文

症状

遍历字典或集合的循环抛出 RuntimeError: dictionary changed size during iteration(或 Set 版本),通常只在执行修改的那个分支上出现。

诊断

在循环中定位修改操作:

for key in my_dict:
    if not wanted(key):
        del my_dict[key]   # raises RuntimeError

用 pop 做最小复现可确认该模式;对 defaultdict 的读取也可能隐式插入键。

修复

遍历快照,或把删除推迟到循环之后:

for key in list(my_dict):
    if not wanted(key):
        del my_dict[key]

# or build a new dict
my_dict = {k: v for k, v in my_dict.items() if wanted(k)}

验证

重新运行并断言最终的键与大小,确认错误消失且容器内容符合预期。