如何可视化和理解这段代码
How to visualize and understand this piece of code
我从 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))
。每次都会 return 一个单独的 lambda
,但是所有这些 lambda
函数都具有相同的净效果。当调用第一个 lambda
时,它会创建另一个,并将其设置为 return 的 defaultdict
的工厂。
我们得到的defaultdict
,将使用lambda
来创建默认值。所以当插入键值对时,值将成为另一个 defaultdict,它有自己的 lambda,可以做同样的事情。
这让我们可以根据需要存储尽可能深的密钥,而无需先创建子字典,因为在每个级别都会根据需要自动创建新层(并且该层会设置为在需要时创建下一层,等等)。
实际代码中的fix
只是将附加参数转发给defaultdict
构造函数。示例代码不使用该功能,但它可用于初始化内容而不是一次分配一个内容(有关详细信息,请参阅 defaultdict
的文档)。
我从 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))
。每次都会 return 一个单独的 lambda
,但是所有这些 lambda
函数都具有相同的净效果。当调用第一个 lambda
时,它会创建另一个,并将其设置为 return 的 defaultdict
的工厂。
我们得到的defaultdict
,将使用lambda
来创建默认值。所以当插入键值对时,值将成为另一个 defaultdict,它有自己的 lambda,可以做同样的事情。
这让我们可以根据需要存储尽可能深的密钥,而无需先创建子字典,因为在每个级别都会根据需要自动创建新层(并且该层会设置为在需要时创建下一层,等等)。
实际代码中的fix
只是将附加参数转发给defaultdict
构造函数。示例代码不使用该功能,但它可用于初始化内容而不是一次分配一个内容(有关详细信息,请参阅 defaultdict
的文档)。