请帮我理解Python中的装饰器(Fibonnacci + memoization)

mon*_*iz7 4 python decorator

我正在尝试理解以下代码(来自这个网站:http://jeremykun.com/2012/01/12/a-spoonful-of-python/):

def memoize(f):
    cache = {}

    def memoizedFunction(*args):
        if args not in cache:
            cache[args] = f(*args)
        return cache[args]

    memoizedFunction.cache = cache  
    return memoizedFunction 

@memoize
def fib(n):
    if n <= 2:
          return 1
    else:
          return fib(n-1) + fib(n-2)
Run Code Online (Sandbox Code Playgroud)

我理解拥有缓存的好处,特别是计算Fibonacci数字之类的东西.我也明白,现在当我调用fib(4)时,它相当于调用myfun(4),其中myfun = memoize(fib).

我不明白为什么每次调用fib都不会将缓存重新分配给{}.

谁能解释一下?

谢谢!

Bre*_*arn 5

装饰器memoize只在fib被定义时被调用一次.将cache存储在一个封闭(代表的局部变量memoize),它每次调用fib访问.每次后续调用都会fib导致调用memoizedFunction,而不是调用memoize,既然既没有fib也没有memoizedFunction重置缓存,它永远不会被重置.