以下是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)
答案 0 :(得分:3)
memory
dict存储在“闭包”中,当函数从封闭函数引用局部变量时创建。闭包包装了这些引用。
您可以将字典视为fact.__closure__[1].cell_contents
。 (fact.__closure__[0].cell_contents
是原始的未修饰函数,它也通过变量f
以类似的方式由装饰函数引用。)