我从https://quanttype.net/posts/2016-03-29-defaultdicts-all-the-way-down.html处获得了这段代码,但无法理解其工作方式或原因。我很想知道别人怎么能想象并理解这一点
在调试器中运行此代码不会产生任何了解
def fix(f):
return lambda *args, **kwargs: f(fix(f), *args, **kwargs)
>>> from collections import defaultdict
>>> d = fix(defaultdict)()
>>> d["a"]["b"]["c"]
defaultdict(<function <lambda> at 0x105c4bed8>, {})
最佳答案
让我们考虑一个fix
的简单版本:
def fix(f):
return lambda: f(fix(f))
当我们调用
fix(defaultdict)
时,我们当然会得到lambda: defaultdict(fix(defaultdict))
。每次都会返回一个单独的lambda
,但是所有这些lambda
函数具有相同的最终效果。调用第一个lambda
时,它将创建另一个,并将其设置为返回的defaultdict
的工厂。我们返回的
defaultdict
将使用lambda
创建默认值。因此,当插入键/值对时,该值将成为另一个defaultdict,它具有自己的lambda,可以执行相同的操作。这使我们可以将密钥存储到所需的深度,而无需先创建子字典,因为在每个级别,如果需要的话,将自动创建新层(该层被设置为在需要时创建下一层,依此类推)。
实际代码中的
fix
只是将其他参数转发到defaultdict
构造函数。示例代码没有使用该功能,但是可以用于初始化内容,而不是一次分配内容(有关更多详细信息,请参见defaultdict
的文档)。关于python - 如何可视化和理解这段代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58635519/