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

关于Python中defaultdict自动创建访问键条目特性的含义问询

搞懂defaultdict自动创建键的坑,以及和setdefault的区别

嘿,这问题太常见了!我来给你把这个点讲得明明白白的~

首先,咱们先拆解你书里那句话:“使用defaultdict时需要注意一点:它会为后续访问的键自动创建字典条目(即使该键当前不存在于字典中)”

先看defaultdict的“自动创建”到底是什么意思

你给的示例代码是这样的:

from collections import defaultdict
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)

这段代码里,d['a']第一次被访问时,因为字典里还没有'a'这个键,defaultdict就自动帮你创建了这个键,并且把它的值设为你指定的默认类型(这里是list,也就是空列表),然后你才能调用append方法。

但重点是:哪怕你只是单纯访问一个不存在的键,而不是赋值或者调用方法,defaultdict也会自动创建这个键!比如咱们加几行测试代码:

print(d)  # 现在是 defaultdict(<class 'list'>, {'a': [1, 2], 'b': [4]})
print(d['c'])  # 这里只是访问'c',没有做任何赋值
print(d)  # 你会发现字典里多了'c': []!

看到没?只是读一下d['c'],这个键就被自动加到字典里了。这有时候会是个坑——比如你本来只是想检查某个键是否存在,不小心写了if d['c'] == []:,那不管原来有没有'c',现在字典里都多了这个键,后续遍历字典的时候就会出现多余的条目。

再看setdefault为什么能避免这个问题

书里说用普通字典的setdefault方法替代,咱们看示例:

d = {} # A regular dictionary
d.setdefault('a', []).append(1)
d.setdefault('a', []).append(2)
d.setdefault('b', []).append(4)

setdefault的逻辑是:

  1. 检查字典里有没有指定的键;
  2. 如果有,直接返回这个键对应的值;
  3. 如果没有,就把这个键和你指定的默认值加到字典里,然后返回这个默认值。

但关键是:只有当你主动调用setdefault方法时,才会创建不存在的键。如果你只是普通访问一个不存在的键,比如print(d['c']),直接就会抛出KeyError,不会自动创建这个键。

比如测试一下:

print(d)  # 现在是 {'a': [1, 2], 'b': [4]}
# print(d['c'])  # 这行直接报错,不会创建'c'键
d.setdefault('c', [])  # 只有调用这个方法时,才会创建'c'
print(d)  # 现在才变成 {'a': [1, 2], 'b': [4], 'c': []}

总结两者的适用场景

  • 用defaultdict:当你确定后续会频繁用到某些键,并且需要它们自动初始化为默认类型(比如列表、集合、int)时,写起来更简洁,不用每次都手动判断键是否存在。
  • 用普通字典+setdefault:当你不想不小心创建多余的键,或者只是偶尔需要给某个不存在的键设置默认值时,更安全,不会因为误访问就生成无用的字典条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 03:27:35