You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python字典循环调用.pop()触发报错,该如何解决?

Python字典遍历中调用.pop()报错的解决方法

报错原因

直接遍历字典时,迭代器是基于当前字典的状态生成的。如果在循环过程中调用.pop()修改字典的大小,迭代器会检测到字典结构发生变化,从而触发RuntimeError: dictionary changed size during iteration。另外需要注意:Python字典的键具有唯一性,你原代码中重复的"PERSON2"键会被自动覆盖,实际字典中仅保留最后一个"PERSON2"条目。

解决方法

方法一:遍历字典键的副本

将字典的键转换为列表(创建一个独立副本),循环时迭代这个副本,这样原字典的修改不会影响迭代过程:

randomDictionary = {
    "PERSON1":{"NAME":"Cheese man","AGE":24},
    "PERSON2":{"NAME":"Pepsi Man","AGE":26},
    "PERSON3":{"NAME":"Something else man","AGE":30},
}
# 遍历键的列表副本
for i in list(randomDictionary.keys()):
    if randomDictionary[i]["NAME"] == "Pepsi Man":
        randomDictionary.pop(i)
print(randomDictionary)

方法二:创建新字典过滤目标条目

不修改原字典,通过字典推导式生成一个排除目标条目的新字典,这种方式更安全,避免原地修改带来的副作用:

randomDictionary = {
    "PERSON1":{"NAME":"Cheese man","AGE":24},
    "PERSON2":{"NAME":"Pepsi Man","AGE":26},
    "PERSON3":{"NAME":"Something else man","AGE":30},
}
# 生成新字典,排除NAME为Pepsi Man的条目
filtered_dict = {key: val for key, val in randomDictionary.items() if val["NAME"] != "Pepsi Man"}
print(filtered_dict)

方法三:手动控制迭代器(不推荐)

通过iter()生成迭代器,配合while循环手动处理迭代过程,这种写法相对繁琐,仅适合特殊场景:

randomDictionary = {
    "PERSON1":{"NAME":"Cheese man","AGE":24},
    "PERSON2":{"NAME":"Pepsi Man","AGE":26},
    "PERSON3":{"NAME":"Something else man","AGE":30},
}
iterator = iter(randomDictionary.items())
while True:
    try:
        key, val = next(iterator)
        if val["NAME"] == "Pepsi Man":
            randomDictionary.pop(key)
    except StopIteration:
        break
print(randomDictionary)

内容的提问来源于stack exchange,提问作者Neoro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:45:48