嵌套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
相关产品推荐
相关产品推荐

