传递int
和lambda: 0
作为参数有什么区别吗?或者在list
和lambda: []
之间?
看起来他们做同样的事情:
from collections import defaultdict
dint1 = defaultdict(lambda: 0)
dint2 = defaultdict(int)
dlist1 = defaultdict(lambda: [])
dlist2 = defaultdict(list)
for ch in 'abracadabra':
dint1[ch] += 1
dint2[ch] += 1
dlist1[ch].append(1)
dlist2[ch].append(1)
print dint1.items()
print dint2.items()
print dlist1.items()
print dlist2.items()
## -- Output: --
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
[('a', [1, 1, 1, 1, 1]), ('r', [1, 1]), ('b', [1, 1]), ('c', [1]), ('d', [1])]
[('a', [1, 1, 1, 1, 1]), ('r', [1, 1]), ('b', [1, 1]), ('c', [1]), ('d', [1])]
但有没有他们会有不同行为的情况,或者仅仅是一种符号差异?
答案 0 :(得分:40)
defaultdict
所需要的只是一个可调用对象,它将返回在没有参数的情况下调用时应该用作默认值的对象。
如果您要调用int
构造函数,它将返回0
,如果您要调用lambda: 0
,它将返回0
。与列表相同。这里唯一的区别是构造函数将始终使用它的逻辑来创建对象。一个lambda,如果你选择这样做,你可以添加额外的逻辑。
如,
# alternating between `0` and `[]`
from itertools import count
factory = lambda c=count(): 0 if next(c) % 2 else []
superdict = defaultdict(factory)