迭代时修改列表与字典:为何字典操作会触发报错?
迭代时修改列表与字典的行为差异
咱们先来看这段在迭代过程中逐个移除元素的列表代码:
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
相关产品推荐
相关产品推荐

