为什么Python defaultdict 使用工厂方法模式?

Har*_*man 3 python dictionary

Python 有一个defaultdict,其行为类似于字典,只不过它在遇到新键时输出默认值。此默认值是使用default_factory属性创建的,该属性是一个不带参数的函数。

例如,d = defaultdict(int)创建一个d默认值为 0 的字典,因为int()返回 0。

为什么默认值存储为不带参数的函数,而不是存储默认值本身?我假设这种选择的实现背后有一个原因,但我不明白它是什么。从天真的角度来看,存储默认值似乎同样有效且不那么复杂。

fla*_*kes 6

考虑一下这对于可变类型如何工作。

例如,d = defaultdict(list)为请求的每个未分配的键创建一个新的列表对象。如果您使用单个实例,则每个键将返回该列表的相同实例。例如,附加到由一个键返回的实例d[1].append(2)将具有将值附加到字典中的每个其他键的可观察行为。几乎在所有情况下这种行为都是不受欢迎的。

是的,对于原始/不可变数据类型,如intfloatstr等,默认值是可以接受的,但这并不涵盖容器或其他可变结构的巨大用例,在这些用例中,您希望每个键的值是唯一的。