当与lambda一起使用时,类型defaultdict到底是做什么的?我有这个示例,甚至对于int、list和lambda作为参数也很好:
d = defaultdict(int)
d['one'] = lambda x:x*x
d['one'](2)
4
d = defaultdict(list)
d['one'] = lambda x:x*x
d['one'](2)
4
d = defaultdict(lambda: None)
d['one'] = lambda x:x*x
d['one'](2)
4我每次都有同样的结果。那么,使用lambda "default (lambda: None)“初始化的主要原因是什么?defaultdict字典并不关心传入哪种类型的参数。
发布于 2015-11-22 17:23:27
只有当您访问未显式添加到字典中的键时,您的示例才有意义:
>>> d = defaultdict(int)
>>> d['one']
0
>>> d = defaultdict(list)
>>> d['one']
[]
>>> d = defaultdict(lambda: None)
>>> d['one'] is None
True正如您所看到的,使用默认dict将给您尝试访问默认值的每个键。该默认值是通过调用传递给构造函数的函数获得的。因此,传递int将int()设置为默认值( 0);传递list将将list()设置为默认值(这是一个空列表[]);传递lambda: None将将(lambda: None)()设置为默认值(即None)。
默认字典就是这么做的。没别的了。
这样,您就可以设置默认设置,在第一次访问密钥时不需要手动设置这些默认值。例如,类似这样的东西:
d = {}
for item in some_source_for_items:
if item['key'] not in d:
d[item['key']] = []
d[item['key']].append(item)只要在访问每个字典项时设置一个新的空列表,就可以简化为以下内容:
d = defaultdict(list)
for item in some_source_for_items:
d[item['key']].append(item)defaultdict将确保正确初始化列表。
发布于 2015-11-22 16:59:14
您没有使用默认值工厂。如果您所做的只是分配给键,而不是尝试检索字典中还没有的键,您就不会看到区别。
默认值工厂(defaultdict()的第一个参数)不是类型声明。相反,每当您尝试访问字典中尚未包含的键时,都会调用它:
>>> from collections import defaultdict
>>> def demo_factory():
... print('Called the factory for a missing key')
... return 'Default value'
...
>>> d = defaultdict(demo_factory)
>>> list(d) # list the keys
[]
>>> d['foo']
Called the factory for a missing key
'Default value'
>>> list(d)
['foo']
>>> d['foo']
'Default value'
>>> d['bar'] = 'spam' # assignment is not the same thing
>>> list(d)
['foo', 'bar']
>>> d['bar']
'spam' 只有在我第一次尝试访问密钥'foo'时,工厂才被调用以生成一个默认值,然后将其存储在字典中以供以后的访问。
因此,对于每个不同的示例,它们之间的不同之处在于为每个示例生成的默认值。您永远不会访问此功能,因为您直接分配给了'one'密钥。
如果您访问了一个不存在的键,您将分别创建一个值为0、空列表或None的整数。
https://stackoverflow.com/questions/33857449
复制相似问题