为何Python3迭代字典修改大小会报RuntimeError,而早期Python版本不会?
问题解答
不是,这个差异和「Python 3.7起字典有序」的特性完全无关,真正原因是Python 2和Python 3中dict.items()的返回类型不同:
核心差异点
- Python 2.x:
dict.items()会返回一个包含所有键值对的列表快照——迭代开始前就把字典的键值对完整复制到列表里,后续修改字典的大小(添加/删除键)不会影响正在进行的迭代,所以不会报错。第二个循环才会遍历到新添加的键"e"。 - Python 3.x:
dict.items()返回的是一个动态视图对象——它会实时映射原字典的内容,迭代过程中如果修改字典的大小(比如添加新键"e"),会破坏迭代的一致性,Python会直接抛出RuntimeError: dictionary changed size during iteration来阻止这种不安全的操作。
验证:字典有序不影响报错逻辑
哪怕在Python 3.6(字典有序是实现细节,3.7正式纳入规范)中运行这段代码,依然会触发相同的报错,这直接证明报错和字典是否有序没有关系。
解决办法
如果需要在迭代字典时修改其大小,可以迭代字典的副本,比如把items()转换成列表:
dict = {"a": 1, "b": 2, "c": 3, "d": 4} # 迭代副本,修改原字典不会影响迭代 for key, val in list(dict.items()): if key == "b": dict["e"] = 5 for key, val in dict.items(): print(key, val)
这段代码在Python3中可以正常运行,输出包含新添加的"e":5。
内容的提问来源于stack exchange,提问作者shubhcodegate
相关产品推荐
相关产品推荐

