了解嵌套的 defaultdict 和 `tree = lambda: defaultdict(tree)` 与 `tree = defaultdict(lambda: tree)`

Understanding nested defaultdict and `tree = lambda: defaultdict(tree)` vs `tree = defaultdict(lambda: tree)`

工作形式

another question,我看到了如何创建 defaultdict 的 defaultdict 的 defaultdict...如:

Working form Using it Output
tree = lambda: defaultdict(tree)
x = tree()
x["1"]
x["2"]
x["1"]["3"]

print(json.dumps(x))
{"1": {"2": {}}, "2": {}}

它按预期运行,但我无法理解它。


非工作形式

此外,为什么以下根本不起作用:

Non Working form Using it Output
tree = defaultdict(lambda: tree)
x = tree
x["1"]
x["2"]
x["1"]["3"]

print(json.dumps(x))
ValueError: Circular reference detected

谁能解释一下,tree = lambda: defaultdict(tree) 是如何工作的,为什么 tree = defaultdict(lambda: tree) 不工作?


编辑:@Samwise 在评论中指出 treedefaultdict 的每个参数都需要可调用,因此要使第二种形式起作用,它需要是:

tree = lambda: defaultdict(lambda: tree())

但由于 lambda: tree() 等同于 tree,因此修改后的形式等同于第一种形式。

这里:

tree = lambda: defaultdict(tree)

tree是一个函数,每次执行都会创建一个defaultdict。 defaultdict 的默认值通过再次调用 tree 给出,每次都会创建一个新的 defaultdict。


这里:

tree = defaultdict(lambda: tree)

tree 是一个特定的 defaultdict。 defaultdict 的默认值由 returns tree 函数给出,同一个特定的 defaultdict。所以字典的默认值就是它自己。