Python字典赋值时机解析及无计数赋值代码报错排查
两段Python字典操作的KeyError问题解析
第一段代码的字典赋值逻辑
第一段代码实现了CSV中title列的出现次数统计,字典titles的赋值逻辑明确:
- 遍历CSV每一行,提取并格式化
title(去除首尾空格、转为大写) - 若
title已存在于titles中,就将对应计数加1 - 若
title不存在于字典中(else分支),则为字典新增该键并赋值为1,完成首次计数的初始化
因此所有出现过的title都会被存入titles字典,不会出现键缺失的情况。
第二段代码的错误原因
第二段代码触发键错误(KeyError),核心问题有两个:
1. 错误的字典键添加方式
在if not title in titles:分支中,代码写的是titles[title]——这行代码不是给字典新增键,而是尝试读取字典中不存在的title键对应的值。Python不允许直接访问字典中不存在的键,因此会立刻抛出KeyError。
如果要实现“仅存储不重复的title”的需求,正确的写法是给键赋予一个占位值(值的类型不影响,只要完成键的添加):
if not title in titles: titles[title] = True # 也可以赋值为0、None等任意值
2. 循环结束后访问title的潜在问题
即使修复了上述问题,最后一行print(titles[title])仍有逻辑隐患:title是循环变量,循环结束后它保存的是CSV最后一行的title值。如果最后一行的title之前已存在于字典中,虽然不会触发KeyError,但这行代码通常不是你想要的结果(你大概率是想打印整个字典或特定键的值,而非依赖循环的最后一个变量)。
内容的提问来源于stack exchange,提问作者Syed Rashid Mujahid
相关产品推荐
相关产品推荐

