10

这是 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
4

1 回答 1

15

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

如果您传递了一个常量并且 did defaultdict([]),那么每次访问缺少的键时,它的值都会被设置为同一个列表。然后你会得到这个:

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

拥有一个可变的默认值实际上是非常常见和有用的,因为它可以让你做一些事情,d[key].append("Blah")而不必先检查它是否d[key]存在。对于这种情况,您每次都需要某种方法来返回一个新值,而最简单的方法是拥有一个返回默认值的可调用对象。

于 2013-09-14T02:48:33.477 回答