次の例を検討してください。
def g():
in_g=100
def f1():
nonlocal in_g
in_g = 10
def f2():
nonlocal in_g
print(in_g)
return (f1,f2)
(f1, f2) = g()
f2() #prints 100
f1()
f2() #prints 10
内部関数 と の両方がf1
、f2
「クロージャー」内で変数 にアクセスしますin_g
。しかし、帰国後、記憶のg
どこに保管されているのでしょうか。in_g
g
while の実行中in_g
は、 への呼び出しに対応するスタック フレーム上の変数であると仮定しg
ます。したがって、変数 を使用するとg
、f1
とf2
はすべて (スタック上の) 同じメモリ位置にアクセスしますin_g
。
しかし、例に見られるように、g
リターンの後、 を参照するときに同じメモリ位置にアクセスしf1
ます。ただし、返されたので、そのメモリの場所をスタックに置くことはできません。f2
in_g
g