2017-02-09 110 views
0

下面是一个memoized阶乘函数的简单例子。它工作正常,我了解基本概念,但有一个细节让我感到困惑。变量memory在哪里?为什么在memoize()完成执行后仍然存在?它似乎不是一个全球变量,因为我不能做类似print memory的事情。这里发生了什么?备忘python函数的缓存在哪里存在?

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) 
+2

它存在于[closure](https://en.wikipedia.org/wiki/Closure_ (computer_programming))包装'fact' –

+0

当你在另一个函数中声明一个函数时,内部函数可以看到在外部函数中声明的所有变量。它被称为封闭。 – Gabriel

回答

3

memory字典被存储在“闭合”,这在创建时的功能的引用从包围函数的局部变量。封闭包装这些参考。

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

+0

不错,我没有意识到你可以轻松地反思封闭! –