memoized python函数的缓存在哪里?

时间:2017-02-09 19:28:26

标签: python python-2.7 memoization

以下是memoized factorial函数的简单示例。它工作正常,我理解基本概念,但一个细节让我感到困惑。变量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)

1 个答案:

答案 0 :(得分:3)

memory dict存储在“闭包”中,当函数从封闭函数引用局部变量时创建。闭包包装了这些引用。

您可以将字典视为fact.__closure__[1].cell_contents。 (fact.__closure__[0].cell_contents是原始的未修饰函数,它也通过变量f以类似的方式由装饰函数引用。)