我从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/

10-12 22:37