私は、Pythonの変数バインディングがどのように機能するかを正確に理解しようとしています。これを見てみましょう:
def foo(x):
def bar():
print y
return bar
y = 5
bar = foo(2)
bar()
これは私には合理的と思われる5を印刷します。
def foo(x):
def bar():
print x
return bar
x = 5
bar = foo(2)
bar()
これは奇妙な2を印刷します。最初の例では、Pythonは実行中に変数を検索し、2番目の例ではメソッドが作成されます。なんでそうなの?
明確にするために:これは非常にクールで、私が望むとおりに機能します。ただし、内部バー関数がどのようにコンテキストを取得するかについては混乱しています。内部で何が起こっているのかを理解したいと思います。
編集
ローカル変数の方が優先度が高いことは知っています。私が興味を持っているのは、Pythonが実行中に、以前に呼び出した関数から引数を取得することをどのように知っているかです。bar
で作成されfoo
、x
現在は存在しません。x
関数が作成されたときにこれを引数値にバインドしましたか?