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

标签 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):
        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] 存在。对于这种情况,您需要某种方法每次都返回一个新值,而最简单的方法是使用一个返回默认值的可调用对象。

关于python - 为什么 defaultdict 构造函数采用函数而不是常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18797778/

相关文章:

python - Python 中的模型 I-V

python - 如何在 python 中使用 Plotly 离线模式绘制条形图?

python - 素数与 python

java - 使用 Set 从 arrayList 中删除重复列表

json - 解析 JSON、MS Access VBA(嵌套循环)

c# - 使用不同的泛型参数初始化泛型集合数组

.net - BlockingCollection(T) 性能

python - 沿 B 广播 A 的每一行,避免 `repeat`

java - 如何对没有实现 Iterable 的类使用 for-each 循环

python - 如何将附加参数(除了参数)传递给函数?