为什么defaultdict构造函数采用函数而不是常量

Kal*_*lEl 7 python collections

这是defaultdict的工作原理:

from collections import defaultdict
a=defaultdict(lambda:3)
a[200]==3 #True
Run Code Online (Sandbox Code Playgroud)

为什么它defaultdict被设计为采用没有参数的函数,而不仅仅是一个常量值?


这是另一种定义.

class dd(dict):
    def __init__(self,x):
        self._default=x
    def __getitem__(self,key):
        if key in self: return dict.__getitem__(self, key)
        else:
            self[key]=self._default
            return self[key]
Run Code Online (Sandbox Code Playgroud)

以便

a=dd(3)
a[200]==3 #True
Run Code Online (Sandbox Code Playgroud)

Bre*_*arn 12

因为如果你想要的默认值是一个可变对象,你可能希望它是每个键不同的可变对象.

如果你传递了一个常量并且没有defaultdict([]),那么每次访问一个丢失的键时,它的值都将被设置为相同的列表.然后你会得到这个:

>>> d = defaultdict([])
>>> d[1].append("Whoops")
>>> print d[2]
["Whoops"]
Run Code Online (Sandbox Code Playgroud)

具有可变的默认值实际上是非常常见且有用的,因为它允许您执行诸如d[key].append("Blah")无需先检查d[key]存在的事情.对于这种情况,你需要一些方法来每次返回一个新的价值,要做到这一点最简单的方法是有一个返回默认值的调用.

  • 同意.后续问题......如果它必须是一个函数,那么让函数选择性地将密钥作为输入是不是更有用呢?例如``defaultdict(lambda x:x + 1)``可以为``a [200]``返回``201``. (2认同)