我正在尝试了解Python装饰器,并且想更详细地了解闭包如何应用,例如在此备注上下文中:
def memoize(f):
memo = {}
def helper(x):
if x not in memo:
memo[x] = f(x)
return memo[x]
return helper
@memoize
def fib(n):
if n in (0,1):
return n
return fib(n - 1) + fib(n - 2)
Run Code Online (Sandbox Code Playgroud)
我了解即使程序流不再位于该封闭范围内,也memoize将返回绑定到memo其封闭范围内的值的函数helper。因此,如果memoize反复调用,它将根据的当前值返回变化的功能序列memo。我也了解这@memoize是语法糖,它导致调用fib(n)被替换为memoize(fib(n))。
我苦苦挣扎的是nin 的调用值如何fib(n)有效地转换为xin helper(x)。大多数关于闭包的教程似乎都没有明确指出这一点,或者他们隐约地说一个函数“关闭”了另一个函数,这听起来像是魔术。我可以看到如何使用语法,但是希望更好地掌握这里发生的事情以及代码执行时传递的对象和数据。