尝试用列表为字典设置键值对时触发‘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)
这里的问题有两个:
- 当你
zip(code, keys, values)时,迭代的是code的键(默认迭代字典就是迭代键),一开始code有3个空字符串键。 - 你以为
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
相关产品推荐
相关产品推荐

