【发布时间】:2017-01-04 03:37:18
【问题描述】:
我正在尝试学习 Python 装饰器,我想更详细地了解闭包是如何应用的,例如在这个 memoization 上下文中:
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)
我了解memoize 返回的函数绑定到helper 封闭范围内的memo 值,即使程序流不再在该封闭范围内。因此,如果memoize 被重复调用,它将根据memo 的当前值返回不同的函数序列。我也知道@memoize 是一种语法糖,它会导致对fib(n) 的调用被对memoize(fib(n)) 的调用替换。
我苦苦挣扎的地方是fib(n) 中n 的调用值如何有效地转换为helper(x) 中的x。大多数关于闭包的教程似乎都没有明确说明这一点,或者他们只是含糊地说一个函数“关闭”另一个函数,这听起来就像魔术一样。我可以了解如何使用语法,但希望更好地掌握这里发生的确切情况以及代码执行时传递的对象和数据。
【问题讨论】:
-
“fib(n)中n的被调用值如何有效转换为helper(x)中的x”?我想你已经把它弄反了。例如,当有人调用
fib(5)时,实际调用的是helper(5),所以x是5。helper然后调用(真正的)fib,即memo[5] = f(5),所以现在n也是5。这些是正常的函数调用。绝对没有魔法。 -
我在 (stackoverflow.com/questions/739654/…) 看到了关于装饰器的非常好的答案,但这似乎并没有解决我的特殊困难
-
@MichaelMaggs:您误解了装饰器的工作原理,您可能需要重新阅读该帖子。
标签: python closures decorator memoization python-decorators