Python使用for循环修改字典键触发RuntimeError的原因排查
字典键修改报错原因及解决办法
为啥会报这个错?
Python里字典的items()返回的是个动态视图,它会跟着字典的实时变化走。你在遍历的时候,用d.pop(key)删掉了原来的键,还加了新键,这直接改了字典的键集合,迭代器本来是按原键顺序遍历的,现在结构变了,它没法继续,就抛出RuntimeError了。说白了就是:你一边遍历字典,一边拆改它的结构,迭代器跟不上趟了。
正确的写法有这几种
1. 遍历原键的副本
把原字典的键转成列表(相当于存了一份固定的旧键清单),这样遍历的是固定的旧键,不会受后续修改影响:
import re d = {"given_age":"30","given_weight":"160","given_height":6} for key in list(d.keys()): # 用list()生成键的静态副本 new_key = re.sub(r'given_','',key) if new_key != key: d[new_key] = d.pop(key)
2. 用字典推导式直接生成新字典
这种更简洁,直接造个新字典,不用动原字典的结构:
import re d = {"given_age":"30","given_weight":"160","given_height":6} d = {re.sub(r'given_','',k): v for k, v in d.items()}
3. 遍历原items的副本
和第一种思路类似,遍历list(d.items())生成的静态副本,这样遍历过程中修改原字典也不会影响迭代:
import re d = {"given_age":"30","given_weight":"160","given_height":6} for key, value in list(d.items()): new_key = re.sub(r'given_','',key) if new_key != key: d.pop(key) d[new_key] = value
内容的提问来源于stack exchange,提问作者user2333234
相关产品推荐
相关产品推荐

