循环修改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
相关产品推荐
相关产品推荐

