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

嵌套defaultdict创建报错:TypeError: first argument must be callable or None

问题原因与解决方法

这个错误的核心原因很好理解:defaultdict的第一个参数必须是可调用对象(比如函数、lambda表达式)或者None,而你最内层写的defaultdict([])里,[]是一个已经创建好的空列表实例,不是可调用的——当defaultdict需要自动生成默认值时,它会尝试“调用”你传入的参数,但列表实例没法被调用,所以就抛出了TypeError。

正确的写法

你需要把最内层的默认值生成逻辑改成可调用的形式,用lambda: []来替代[],这样每次需要默认列表时,都会调用这个lambda生成一个全新的空列表:

from collections import defaultdict

dd = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: [])))

验证使用

现在再执行你原来的调用就完全没问题了:

dd['something1']['something11']['something111'].append('something')
print(dd['something1']['something11']['something111'])  # 输出: ['something']

更简洁的进阶写法(可选)

如果嵌套层级比较多,写多层lambda会显得繁琐,你可以用递归函数定义一个通用的嵌套defaultdict生成工具:

from collections import defaultdict

def nested_defaultdict(depth, final_type):
    if depth == 1:
        return defaultdict(final_type)
    return defaultdict(lambda: nested_defaultdict(depth - 1, final_type))

# 生成你需要的4层结构(str:str:str:list)
dd = nested_defaultdict(3, list)

这样后续如果要调整嵌套层级或者最终的默认类型,修改起来会更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:59:34