You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历Python字典时触发‘dictionary changed size during iteration’错误的原因与解决

问题原因

你的代码触发RuntimeError: dictionary changed size during iteration的核心原因是遍历字典时修改了字典的大小:

  • enumerate(di)会遍历字典的键,返回(索引值, 字典键)的元组,比如第一次循环得到(0, 45),第二次得到(1, 34)。
  • 循环语句for key, di[key] in enumerate(di)中,会把索引值赋值给key,再把字典键赋值给di[key]——由于原字典没有0、1这类索引值作为键,这一步会给字典新增键值对,每循环一次字典就多一个条目,迭代器检测到字典大小变化,直接抛出错误。
解决方法

根据你想要获取遍历位置索引+字典键值的需求,提供两种正确写法:

方法1:遍历键值对同时获取索引

直接遍历di.items()拿到字典的键值对,再用enumerate添加索引:

di = dict([(45, "Sdds"), (34, "Dffd")])
for idx, (dict_key, dict_val) in enumerate(di.items()):
    print(f"we are at key {idx} and value in dict {dict_val} (original dict key: {dict_key})")

方法2:先把字典键转为列表再遍历

如果只需要遍历原字典的键并记录索引,先把键转成列表,避免迭代过程中字典变化的影响:

di = dict([(45, "Sdds"), (34, "Dffd")])
for idx, dict_key in enumerate(list(di.keys())):
    print(f"we are at key {idx} and value in dict {di[dict_key]}")

额外提示

如果业务需要在遍历过程中修改字典(新增/删除键值对),必须先创建原字典的副本(比如list(di.keys())或di.copy()),遍历副本而非原字典,就不会触发该错误。

内容的提问来源于stack exchange,提问作者Venkatesh K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:45:57