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

迭代时修改列表与字典:为何字典操作会触发报错?

迭代时修改列表与字典的行为差异

咱们先来看这段在迭代过程中逐个移除元素的列表代码:

x = list(range(5))
for i in x:
    print(i)
    x.pop()

它会输出 0、1、2,只有前三个元素被打印出来。这是因为列表的迭代是基于索引顺序进行的:初始列表长度为5,第一次迭代取索引0的元素0,执行pop()移除最后一个元素后列表长度变为4;第二次迭代取索引1的元素1,再次pop()后列表长度变为3;第三次迭代取索引2的元素2,pop()后列表长度变为2。此时下一次迭代要取索引3,但列表已经没有这个位置的元素了,迭代就停止了,所以只打印了前三个值。

但如果对字典执行类似的操作:

y = {i: i for i in range(5)}
for i in y:
    print(i)
    y.pop(i)

它只会输出0,随后立刻抛出 RuntimeError: dictionary changed size during iteration 错误。这是因为Python的字典迭代器会主动检测自身的大小变化——在迭代过程中添加或删除键会打破迭代的一致性,为了避免出现不可预测的迭代结果,字典会直接抛出这个错误来终止程序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:36:07