了解嵌套的 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 在评论中指出 tree
和 defaultdict
的每个参数都需要可调用,因此要使第二种形式起作用,它需要是:
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。所以字典的默认值就是它自己。
工作形式
从another question,我看到了如何创建 defaultdict 的 defaultdict 的 defaultdict...如:
Working form | Using it | Output |
---|---|---|
|
|
|
它按预期运行,但我无法理解它。
非工作形式
此外,为什么以下根本不起作用:
Non Working form | Using it | Output |
---|---|---|
|
|
|
谁能解释一下,tree = lambda: defaultdict(tree)
是如何工作的,为什么 tree = defaultdict(lambda: tree)
不工作?
编辑:@Samwise 在评论中指出 tree
和 defaultdict
的每个参数都需要可调用,因此要使第二种形式起作用,它需要是:
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。所以字典的默认值就是它自己。