defaultdict :第一个参数必须是可调用的或 None
defaultdict : first argument must be callable or None
我运行下面的代码:
from collections import defaultdict
lst = list(range(0,5))
d = defaultdict(lst)
我得到了这个错误:
TypeError: first argument must be callable or None
请帮忙
您应该使参数可调用,例如,使用 lambda
:
from collections import defaultdict
d = defaultdict(lambda: list(range(0,5)))
print(d[0])
# [0, 1, 2, 3, 4]
对于defaultdict
,默认值通常不是真正的值,它是工厂:生成新值的方法。您可以使用生成列表的 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
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 问题中查看有关 callable 的更多信息。
我运行下面的代码:
from collections import defaultdict
lst = list(range(0,5))
d = defaultdict(lst)
我得到了这个错误:
TypeError: first argument must be callable or None
请帮忙
您应该使参数可调用,例如,使用 lambda
:
from collections import defaultdict
d = defaultdict(lambda: list(range(0,5)))
print(d[0])
# [0, 1, 2, 3, 4]
对于defaultdict
,默认值通常不是真正的值,它是工厂:生成新值的方法。您可以使用生成列表的 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
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 问题中查看有关 callable 的更多信息。