记忆化 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
以类似的方式引用了它。)
下面是一个记忆阶乘函数的简单示例。它工作正常,我理解基本概念,但一个细节让我感到困惑。变量 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
以类似的方式引用了它。)