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

Python3需用pop()删字典M开头键 遍历报RuntimeError求解

报错原因

Python 3 中dict.items()返回的是字典的动态视图对象,遍历过程中如果对原字典执行增、删操作改变字典大小,迭代器会直接检测到结构变化,抛出RuntimeError: dictionary changed size during iteration错误。在遍历原字典的循环里直接调用pop()删除条目,就触发了这个保护机制。

注意:原有代码里states.pop(key, val)的第二个参数是键不存在时pop的返回默认值,删除已确认存在的键时不需要传入这个参数。

正确实现(强制使用pop()方法)

核心思路是不要直接遍历原字典的动态视图,而是遍历静态的键序列,避免迭代过程和字典修改操作冲突。

方法1:遍历键的列表副本

循环启动前先把字典所有键转为静态列表,后续遍历这个独立列表时,修改原字典不会影响迭代流程:

states = {
        'AK': 'Alaska',
        'AL': 'Alabama',
        'AR': 'Arkansas',
        'MN': 'Minnesota',
        'MO': 'Missouri',
        'MP': 'Northern Mariana Islands',
        'MS': 'Mississippi',
}

for key in list(states.keys()):
    if key.startswith('M'): # 用startswith比取key[0]更严谨,可避免空键触发索引错误
        states.pop(key)

方法2:先收集待删除键再统一删除

先遍历一次字典把所有符合删除条件的键存到独立列表,再遍历这个待删列表执行pop操作:

states = {
        'AK': 'Alaska',
        'AL': 'Alabama',
        'AR': 'Arkansas',
        'MN': 'Minnesota',
        'MO': 'Missouri',
        'MP': 'Northern Mariana Islands',
        'MS': 'Mississippi',
}

# 收集所有M开头的键
del_keys = [k for k in states if k.startswith('M')]
for key in del_keys:
    states.pop(key)

两种方法执行完成后,原字典剩余内容为:

{'AK': 'Alaska', 'AL': 'Alabama', 'AR': 'Arkansas'}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:33:25