迭代时修改字典大小报错,是否有支持该操作的Python旧版本?
回答
支持该操作的Python版本
- 所有Python 2.x版本:在Python 2中,直接迭代字典(
for i in di)时,会隐式生成字典键的静态列表副本,迭代完全基于这个副本进行——哪怕你在循环里删除原字典的键,也不会干扰迭代流程,自然不会触发RuntimeError。 - 所有Python 3.x版本(3.0及以后)都不支持这种写法:从Python 3开始,迭代字典返回的是动态的
dict_keys视图对象,它会实时同步原字典的变化。一旦迭代过程中字典的大小被修改(比如删除键),就会抛出RuntimeError: dictionary changed size during iteration。
差异原因
Python 2的字典迭代逻辑是先复制键到列表,让迭代与原字典的动态变化解耦;而Python 3为了优化内存占用和迭代性能,改用了动态视图机制,视图直接绑定原字典,因此严格禁止迭代时修改字典大小。
跨版本兼容的修正写法
要让代码在所有Python版本里都能正常运行,只需先把字典的键转换成列表副本再迭代:
di={'1':[1],'2':[2],'3':[1,2,3,4],'4':[4,5,6]} print(di) # 迭代键的列表副本,避免修改原字典影响迭代流程 for i in list(di): if len(di[i])>=2: del di[i] print(di)
内容的提问来源于stack exchange,提问作者kmh
相关产品推荐
相关产品推荐

