defaultdict:第一个参数必须是可调用的或无

时间:2017-02-09 13:20:44

标签: python defaultdict

我运行了以下代码:

from collections import defaultdict
lst = list(range(0,5))
d = defaultdict(lst)

我收到了这个错误:

TypeError: first argument must be callable or None

请帮忙

3 个答案:

答案 0 :(得分:14)

对于defaultdict 默认值通常实际上不是值,它是工厂:生成新的价值。您可以使用生成列表的 lambda表达式来解决此问题:

lst = lambda:list(range(0,5))
d = defaultdict(lst)

这也是一个好主意,因为否则所有默认值引用相同的列表。例如:

d[1].append(14)

会对d[2]产生影响(鉴于d[1]d[2]都不存在)。

可以通过以下方式实现此

val = list(range(0,5))
lst = lambda:val
d = defaultdict(lst)

但这会产生不必要的副作用:如果您在此处执行d[1].append(14),那么d[2]将为[1,2,3,4,5,14]d[1] is d[2]将为True

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import defaultdict
>>> val = list(range(0,5))
>>> lst = lambda:val
>>> d = defaultdict(lst)
>>> d[1]
[0, 1, 2, 3, 4]
>>> d[1].append(14)
>>> d[2]
[0, 1, 2, 3, 4, 14]
>>> d[1] is d[2]
True

,而:

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import defaultdict
>>> lst = lambda:list(range(0,5))
>>> d = defaultdict(lst)
>>> d[1]
[0, 1, 2, 3, 4]
>>> d[1].append(14)
>>> d[2]
[0, 1, 2, 3, 4]
>>> d[1] is d[2]
False

答案 1 :(得分:6)

你应该使用lambda

使参数成为可调用的
from collections import defaultdict

d = defaultdict(lambda: list(range(0,5)))
print(d[0])
# [0, 1, 2, 3, 4]

答案 2 :(得分:4)

Default dictionary接受callable作为第一个参数(对于未定义的值是默认工厂),所以你想要做的是下一步:

from collections import defaultdict


default_factory = (lambda: list(range(0,5))
d = defaultdict(default_factory)

What is a "callable" in Python? SO问题中查看有关可调用的更多内容。