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

Python3迭代字典时删除键报错:RuntimeError: dictionary changed size during iteration

解决Python迭代字典时删除键触发RuntimeError的问题

嘿,这个问题我之前也踩过坑!咱们先搞清楚为什么会报错,再一步步解决它~

为什么第一个代码会报错?

当你用for k, v in mydict.items()迭代字典时,items()返回的是一个和原字典绑定的迭代器。如果在迭代过程中修改了字典的大小(比如删除键),迭代器会立刻检测到这个变化,直接抛出RuntimeError: dictionary changed size during iteration——这是Python的一种保护机制,防止迭代过程中出现意外的行为。

为什么第二个代码还是报错?

你以为new_dict = mydict是复制了一个新字典?其实不是!在Python里,赋值操作只是让new_dict指向了和mydict同一个字典对象,它们是共享同一个内存空间的。所以你删除new_dict[k]本质上还是在修改原字典,自然还是会触发同样的错误。

三种正确的解决方法

方法1:迭代字典键的副本

直接生成原字典键的列表副本,迭代这个副本,这样原字典的修改就不会干扰迭代过程了:

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
# 用list()把键转换成列表,得到一个独立的副本
for k in list(mydict.keys()):
    if k == 'two':
        del mydict[k]
        continue
    print(k)

运行这段代码,你会发现输出one、three、four,而且不会报错~

方法2:创建原字典的真正副本,迭代副本修改原字典

如果需要同时遍历键值对,可以先创建原字典的浅拷贝,迭代这个拷贝,然后修改原字典:

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
# 用copy()生成真正的独立副本,或者用dict(mydict)也行
copy_dict = mydict.copy()
for k, v in copy_dict.items():
    if k == 'two':
        del mydict[k]
        continue
    print(k)

这里copy_dict是完全独立的字典,迭代它的时候,原字典的修改不会影响迭代器,所以安全无报错。

方法3:用字典推导式生成新字典(更Pythonic)

如果不需要原地修改原字典,而是想得到一个过滤后的新字典,字典推导式是最简洁高效的方式:

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
# 直接生成不包含'two'键的新字典
mydict = {k: v for k, v in mydict.items() if k != 'two'}
# 如果要保留原字典,就赋值给新变量:
# filtered_dict = {k: v for k, v in mydict.items() if k != 'two'}

这种方式不仅不会报错,代码也更简洁,符合Python的风格~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:45:26