Python代码x = defaultdict(lambda: defaultdict(dict))的含义是什么?
拆解
x = defaultdict(lambda: defaultdict(dict)) 嘿,咱们来一步步拆解这个有点“套娃”感的代码,搞明白它到底在干啥~
首先得先回忆下collections.defaultdict的核心作用:它是Python标准库collections里的字典子类,最大的特点是当你访问一个不存在的键时,它会自动用你指定的“默认工厂函数”创建对应的值,而不是直接抛出KeyError。
现在咱们从外到内拆这个嵌套结构:
1. 最外层:defaultdict(...)
这里的外层defaultdict,它的默认工厂是一个匿名函数lambda: defaultdict(dict)——也就是说,当你访问x里一个不存在的键时,它会自动为这个键生成一个值,而这个值本身又是一个defaultdict实例。
2. 中间层:defaultdict(dict)
这个内层的defaultdict,它的默认工厂是普通的dict。意思是,当你访问这个中间层字典里不存在的键时,它会自动创建一个空的普通字典作为对应的值。
3. 最内层:普通dict
这就是最底层的容器了,它就是Python自带的普通字典,没有自动创建键的功能——不过没关系,前面两层已经帮我们搞定了自动嵌套创建的问题。
举个实际使用的例子
比如你想存储多层级的用户订单数据,用这个嵌套的defaultdict就可以直接赋值,完全不用提前初始化每一层:
from collections import defaultdict x = defaultdict(lambda: defaultdict(dict)) # 直接赋值,不用先创建x['Alice']、x['Alice']['order_1001'] x['Alice']['order_1001']['total'] = 99.9 x['Alice']['order_1001']['items'] = ['book', 'pen'] x['Bob']['order_1002']['total'] = 59.9 print(x['Alice']['order_1001']) # 输出: {'total': 99.9, 'items': ['book', 'pen']}
如果换成普通字典,你得写一堆判断或者setdefault,麻烦很多:
x = {} # 必须先确保每一层都存在 x.setdefault('Alice', {}).setdefault('order_1001', {})['total'] = 99.9
总结适用场景
这种嵌套结构特别适合处理需要动态创建多层级字典的场景,比如统计多层级数据、处理JSON风格的嵌套数据、构建树形结构等,能帮你省去大量判断键是否存在的冗余代码,让逻辑更简洁。
内容的提问来源于stack exchange,提问作者SAK
相关产品推荐
相关产品推荐

