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

循环修改OrderedDict键名引发RuntimeError:OrderedDict在迭代期间被修改

解决OrderedDict迭代时修改键名引发的RuntimeError问题

嘿,这个问题我之前也踩过坑!你碰到的RuntimeError: OrderedDict mutated during iteration,本质原因是Python不允许在迭代字典(包括OrderedDict)的同时修改它的结构——当你在循环里执行pop和添加新键操作时,OrderedDict的大小和内部结构发生了变化,导致正在运行的迭代器直接失效。

下面给你几个实用的解决方案:

方案1:迭代键的副本(原地修改)

最直接的思路是先把od.keys()转换成列表,这样迭代的是原始键的静态副本,后续修改原字典不会干扰迭代过程:

from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
od['d'] = 4

# 把keys转成列表,迭代副本而非原字典的动态视图
for key in list(od.keys()):
    od[key+"_"] = od.pop(key)

print(od)
# 输出: OrderedDict([('a_', 1), ('b_', 2), ('c_', 3), ('d_', 4)])

方案2:创建新的OrderedDict(非原地修改)

如果不需要保留原OrderedDict的引用,直接通过生成式创建新对象会更简洁,完全规避迭代时修改的问题:

from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
od['d'] = 4

# 直接生成带新键的OrderedDict
od = OrderedDict((key + "_", value) for key, value in od.items())

print(od)
# 输出: OrderedDict([('a_', 1), ('b_', 2), ('c_', 3), ('d_', 4)])

方案3:先收集所有键值对再重构

和方案2逻辑类似,也可以先把所有键值对提取成列表,清空原字典后再重新插入修改后的键值:

from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
od['d'] = 4

# 先备份所有键值对
items = list(od.items())
od.clear()
# 重新插入修改后的键
for key, value in items:
    od[key + "_"] = value

小建议

  • 如果原字典被其他变量引用,需要原地修改,优先选方案1;
  • 如果可以生成新对象,方案2的代码最简洁易读,推荐日常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:12:31