记忆化 python 函数的缓存位于何处?

Where does a memoized python function's cache live?

下面是一个记忆阶乘函数的简单示例。它工作正常,我理解基本概念,但一个细节让我感到困惑。变量 memory 位于何处?为什么在 memoize() 执行完后它仍然存在?它似乎不是一个全局变量,因为我不能做类似 print memory 的事情。这是怎么回事?

def memoize(f):
    memory = {}
    def memoized(*args):
        if args not in memory:
            memory[args] = f(*args)
        return memory[args]
    return memoized

@memoize
def fact(n):
    if n <= 1:
        return 1
    return n * fact(n - 1)

print fact(10)

memory dict 存储在 "closure" 中,它是在函数从封闭函数引用局部变量时创建的。闭包包装了这些引用。

你可以看到字典为fact.__closure__[1].cell_contents。 (fact.__closure__[0].cell_contents是原始的未修饰函数,修饰后的函数也通过变量f以类似的方式引用了它。)