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

新手上路,请多包涵

我运行了以下代码:

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

我得到了这个错误:

 TypeError: first argument must be callable or None

请帮忙

原文由 Arcyno 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

对于 defaultdict 默认值 通常 不是真正的值,它是一个 工厂:一种生成新值的方法。您可以使用生成列表的 lambda 表达式 来解决此问题:

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

这在这里也是一个好主意,因为否则 所有默认值 都会 引用相同的 list 。例如这里:

 d[1].append(14)

不会d[2] 产生影响(假定 d[1]d[2] 都不存在)。

但是,您可以通过以下方式实现此目的

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

But this can have unwanted side effects: if you here perform d[1].append(14) then d[2] will be [1,2,3,4,5,14] and d[1] is d[2] will be 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

原文由 Willem Van Onsem 发布,翻译遵循 CC BY-SA 4.0 许可协议

您应该使参数可调用,例如,使用 lambda

 from collections import defaultdict

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

原文由 Moses Koledoye 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题