Python 为什么defaultdict构造函数接受函数而不是常量

Python 为什么defaultdict构造函数接受函数而不是常量,python,collections,Python,Collections,这就是defaultdict的工作原理: from collections import defaultdict a=defaultdict(lambda:3) a[200]==3 #True 为什么defaultdict被设计成不带参数的函数,而不仅仅是一个常量值? 这是另一个定义 class dd(dict): def __init__(self,x): self._default=x def __getitem__(self,key):

这就是defaultdict的工作原理:

from collections import defaultdict
a=defaultdict(lambda:3)
a[200]==3 #True
为什么
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]
所以

a=dd(3)
a[200]==3 #True

因为如果希望默认值是可变对象,则可能希望每个键的默认值都是不同的可变对象

如果您传递了一个常量并执行了
defaultdict([])
,则每次访问缺少的键时,其值都将设置为相同的列表。然后你会得到这个:

>>> d = defaultdict([])
>>> d[1].append("Whoops")
>>> print d[2]
["Whoops"]

事实上,拥有一个可变的默认值是非常常见和有用的,因为它允许您执行诸如
d[key].append(“Blah”)
之类的操作,而无需首先检查
d[key]
是否存在。在这种情况下,您需要某种方法每次返回一个新值,最简单的方法是让一个可调用函数返回一个默认值。

同意。后续问题。。。如果它必须是一个函数,那么让函数有选择地将键作为输入不是更有用吗?例如,
defaultdict(lambda x:x+1)
可以为
a[200]
返回
201
@kalle:我也经常希望这样。我想没有完成的一个原因是调用程序无法清楚地知道函数是否需要该参数。对于“函数”是
list
dict
的常见情况,您不能传递(不可iterable)参数,这意味着我们没有参数。您可以编写自己的类以这种方式工作,但是是的,我确实希望
defaultdict
能够做到。