显式传入default_factory参数时,defaultdict为何会忽略该参数?
问题解答:default_factory参数传递错误导致的异常
这种情况完全符合预期,问题出在对defaultdict构造函数的参数传递方式理解有误:
defaultdict的构造逻辑defaultdict的构造函数中,default_factory是位置参数,而非关键字参数。它的核心签名简化后为:
def __init__(self, default_factory=None, /, **kwargs):
这里的/表示前面的参数只能通过位置传递,不能用关键字指定。
- 两段代码的差异
d2 = defaultdict(dict):正确将dict作为位置参数传给default_factory,因此d2的default_factory被设置为dict。当访问不存在的key时,会自动调用dict()创建新字典实例,所以d2['key'].update(...)不会报错。d1 = defaultdict(default_factory=dict):这里的default_factory=dict被当作初始化的键值对(属于**kwargs的内容),直接添加到字典中,而实例的default_factory属性保持默认的None。此时d1和普通字典行为一致,访问不存在的'key'会抛出KeyError。
你可以添加一行代码验证这个结论:
print(d1) # 输出:defaultdict(None, {'default_factory': <class 'dict'>})
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

