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

尝试用列表为字典设置键值对时触发‘dictionary changed size during iteration’错误的问题排查

解决字典迭代时出现的dictionary changed size during iteration错误

嘿,我来帮你搞明白这个问题到底出在哪~

先看你的代码逻辑:你想把keys列表里的元素作为新键,values里的对应元素作为值,替换掉原字典code里的空键对吧?但你的写法导致了迭代过程中字典大小被修改,所以抛出了错误。

错误原因分析

你的代码片段:

code = {"": "" , "" : "" , "" : ""}
keys = ["a" , "b" , "c"]
values = ["z" , "y" , "x"]
for x, k, v in zip(code, keys, values):
    x = k
    code[x] = v
print(code)

这里的问题有两个:

  1. 当你zip(code, keys, values)时,迭代的是code的键(默认迭代字典就是迭代键),一开始code有3个空字符串键。
  2. 你以为x = k是修改原字典里的键,但其实x只是个保存了原键副本的变量,修改它完全不会影响字典里的原有键。接着执行code[x] = v时,相当于给字典新增了一个新键值对,原有的空键还留在字典里——这就导致字典的大小从3变成了4,而迭代器正在遍历字典,发现大小变化就会抛出dictionary changed size during iteration错误。

正确的解决方案

根据你的需求,这里提供两种常用的解决方法:

方法1:替换原字典的旧键(保留修改字典的逻辑)

先把原字典的键转成一个独立的列表,这样迭代的是这个静态列表,不会受字典后续修改的影响,然后删除旧键、添加新键值对:

code = {"": "" , "" : "" , "" : ""}
keys = ["a" , "b" , "c"]
values = ["z" , "y" , "x"]

# 先把原字典的键提取成列表,避免迭代时字典变化干扰
original_keys = list(code.keys())
for old_key, new_key, val in zip(original_keys, keys, values):
    del code[old_key]  # 删除旧的空键
    code[new_key] = val  # 添加新的键值对

print(code)  # 输出: {'a': 'z', 'b': 'y', 'c': 'x'}

方法2:直接创建新字典(更简洁)

如果你不需要保留原字典里的空键,直接用dict()配合zip()创建新字典是最简洁的方式:

keys = ["a" , "b" , "c"]
values = ["z" , "y" , "x"]
code = dict(zip(keys, values))

print(code)  # 输出: {'a': 'z', 'b': 'y', 'c': 'x'}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 08:54:07