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

为何未给defaultdict设置int默认值时统计词频程序报错?

为什么defaultdict()无参数时触发KeyError,指定int默认值却能正常运行?

咱们先拆解你遇到的两种场景差异:

出错场景的本质原因

当你初始化some = defaultdict()时,其实没有给它指定默认工厂函数,此时它的默认值是None。这种情况下,defaultdict的行为和普通字典几乎一致——当你第一次访问不存在的键(比如第一个单词'A')时,some[i]会尝试获取该键对应的值,但因为键不存在,又没有工厂函数自动生成默认值,所以直接抛出KeyError。

看这段出错的完整代码(补充了隐含的导入):

from collections import defaultdict

doc = 'A wonderful serenity has taken possession of my entire soul, like these sweet mornings of spring which I enjoy with my whole heart. I am alone, and feel the charm of existence in this spot, which was created for the bliss of souls like mine. I am so happy'
some = defaultdict()
for i in doc.split():
    some[i] = some[i]+1  # 第一次访问'A'时,字典无此键,且无默认值生成逻辑,直接报错

对应的报错信息:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyError: 'A'

正常运行的核心逻辑

当你用defaultdict(int)初始化时,给它指定了int作为默认工厂函数。int()在无参数调用时会返回0,所以每次访问不存在的键时,defaultdict会自动调用int()生成默认值0,把这个键和0绑定,之后执行some[i] + 1就变成了0 + 1,完美避开了键不存在的问题。

看这段正常运行的代码:

some = defaultdict(int)
for i in doc.split():
    some[i] = some[i]+1  # 第一次访问'A'时,自动生成默认值0,计算后赋值为1

最终得到的字典正确统计了每个单词的出现次数:

defaultdict(<class 'int'>, {'A': 1, 'wonderful': 1, 'serenity': 1, 'has': 1, 'taken': 1, 'possession': 1, 'of': 4, 'my': 2, 'entire': 1, 'soul,': 1, 'like': 2, 'these': 1, 'sweet': 1, 'mornings': 1, 'spring': 1, 'which': 2, 'I': 3, 'enjoy': 1, 'with': 1, 'whole': 1, 'heart.': 1, 'am': 2, 'alone,': 1, 'and': 1, 'feel': 1, 'the': 2, 'charm': 1, 'existence': 1, 'in': 1, 'this': 1, 'spot,': 1, 'was': 1, 'created': 1, 'for': 1, 'bliss': 1, 'souls': 1, 'mine.': 1, 'so': 1, 'happy': 1})

两种场景的核心差异总结

  • 无参数defaultdict():默认工厂为None,访问不存在的键时不会自动生成默认值,行为和普通字典一致,直接抛出KeyError。
  • defaultdict(int):指定int为默认工厂,访问不存在的键时自动调用int()生成0,绑定键与默认值后再执行后续操作,避免了键不存在的错误。

说白了,defaultdict的核心价值就是帮你自动处理「键不存在时的默认值生成」,要是不指定生成默认值的工厂函数,它就没法发挥这个作用啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:07:53