传递intlambda: 0作为参数之间有什么区别吗?还是在listlambda: []之间?

看起来他们在做同样的事情:

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])]

但是在任何情况下,他们会有不同的行为,还是仅仅是符号上的差异?

最佳答案

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)

关于python - python defaultdict : 0 vs. int和[] vs列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10788378/

10-08 21:39