Python字典已添加的键遍历时报KeyError消失的原因是什么
预填充字典后仍触发KeyError的可能原因
以下是该异常的所有常见触发场景:
- 两次遍历的
edges内容不一致
如果edges是生成器、迭代器而非静态列表,第一次遍历写入字典后迭代器已耗尽,第二次遍历时会重新拉取/生成数据,新生成的元组中包含首次遍历未出现的b值,就会触发报错。此外如果有其他逻辑在两次遍历之间修改了edges列表(追加、删除、修改元组元素),也会出现该问题。 - 字符串key存在隐形差异
URL作为字符串key很容易出现肉眼无法识别的差异:比如包含多余的空格、换行、零宽空格,或者存在URL编码差异(比如空格被编码为%20和未编码的版本)、大小写差异(Python字符串比较大小写敏感,域名部分大小写不敏感的规则不会自动生效)。看起来完全相同的两个URL实际是不同的字符串,自然无法匹配到已写入的key。
可以用下述代码验证该问题:err_key = 'https://support.google.com/chrome/answer/185277' # 对比所有key和报错key的实际值 for k in nodes: if k.strip() == err_key.strip(): print(f"存储key: {repr(k)} 报错key: {repr(err_key)} 是否相等: {k == err_key}") - 并发修改字典
如果你的代码运行在多线程/多协程环境下,有其他逻辑在两次遍历之间删除了nodes中的对应key,或者写入时出现了竞争条件导致该key未实际写入成功,也会触发KeyError。 - 遍历过程中意外修改了字典
如果你实际运行的代码在两次遍历之间有弹出key、重写key值之外的逻辑意外删除了对应key,也会出现该问题。
内容的提问来源于stack exchange,提问作者Tristan Bilot
相关产品推荐
相关产品推荐

