【发布时间】:2021-11-28 18:51:35
【问题描述】:
工作形式
从another question,我看到了如何创建一个defaultdict of defaultdict of defaultdict...为:
| Working form | Using it | Output |
|---|---|---|
|
|
|
它可以正常工作,但我无法理解它。
非工作形式
另外,为什么以下内容根本不起作用:
| Non Working form | Using it | Output |
|---|---|---|
|
|
|
谁能解释一下tree = lambda: defaultdict(tree) 是如何工作的以及为什么tree = defaultdict(lambda: tree) 不工作?
编辑:@Samwise 在 cmets 中指出 tree 和 defaultdict 的每个参数都必须是可调用的,因此要使第二种形式起作用,它必须是:
tree = lambda: defaultdict(lambda: tree())
但是由于lambda: tree()等价于tree,所以这个修改后的形式和第一种形式是等价的。
【问题讨论】:
-
您希望它是
defaultdict(lambda: tree())以产生与defaultdict(tree)相同的结果。否则,tree函数本身永远不会被调用。 -
在第二个中,
tree是一个特定的 defaultdict,它使用的默认值是相同的 defaultdict。在第一个中,每次执行tree都会创建一个新的defaultdict。 -
@Samwise,谢谢。我试过
tree = defaultdict(lambda: tree()),在下一行tree['a']导致错误:TypeError: 'collections.defaultdict' object is not callable` -
您仍然需要外部
lambda来使tree成为一个函数,而不是单个defaultdict对象。所以tree = lambda: defaultdict(tree)有效,tree = lambda: defaultdict(lambda: tree())也有效。tree和defaultdict的每个参数都需要可调用。 -
@Samwise 明白了,谢谢!由于
lambda: tree()等价于tree,这意味着更长的tree = lambda: defaultdict(lambda: tree())等价于tree = lambda defaultdict(tree)。
标签: python tree nested trie recursive-datastructures