我运行了以下代码:
from collections import defaultdict
lst = list(range(0,5))
d = defaultdict(lst)
我得到了这个错误:
TypeError: first argument must be callable or None
请帮忙
最佳答案
对于defaultdict
,默认值通常不是真正的值,它是一个工厂:一个方法产生新的值(value)。您可以使用生成列表的 lambda 表达式 解决此问题:
lst = <b>lambda:</b>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
关于python - 默认字典 : first argument must be callable or None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42137849/