2017-02-09 15 views
0

以下は、メモ型階乗関数の簡単な例です。それは正常に動作し、私は基本的なコンセプトを理解していますが、一つの詳細は私を混乱させる。変数memoryはどこにありますか? memoize()の実行が終了しても、それはなぜ持続しますか? print memoryのようなことはできないので、グローバル変数ではないようです。ここで何が起こっているのですか?memoized 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辞書は、関数は、関数を囲むからローカル変数を参照する場合に作成される「閉鎖」に格納されます。クロージャはこれらの参照をラップします。

dictはfact.__closure__[1].cell_contentsと表示されます。 (fact.__closure__[0].cell_contentsは元の装飾されていない関数であり、同様の方法で修飾された関数によって変数fで参照されます)

+0

ニース、私はあなたが閉鎖をとても簡単にイントロスペクションすることができるとは気付かなかった! –

関連する問題