遍历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
相关产品推荐
相关产品推荐

