下面是一個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)
它存在於[closure](https://en.wikipedia.org/wiki/Closure_ (computer_programming))包裝'fact' –
當你在另一個函數中聲明一個函數時,內部函數可以看到在外部函數中聲明的所有變量。它被稱爲封閉。 – Gabriel