スコープの決定方法

ここまではローカルスコープに属するかどうかは

「代入」した時点で決定する

とのことだったが、実際は違うとのこと。

...(snip)...

代入のタイミングでローカル変数かどうか決まるのであれば、

print x

の時点のxはグローバル変数ということになるが、実際はそうでは無い。
その関数内で代入されているかどうかをPythonは静的に判断しローカル変数かどうかを決定する。

読んだとき結構曖昧だったので私のPythonの理解を以下に示す。

  • 変数がどのスコープに属するかは、どの位置で最初に変数に値を結合したかで決まる
  • ローカル変数を参照するときに...
    • カレントスコープに変数が定義されていたら、ローカル変数を定義した位置に関わらず(つまりprintの後で定義されたとしても)その変数を参照する
    • カレントスコープに変数が定義されていなかったら、LEGBルールでサーチを続ける
    • 変数が見つからなかったらエラー


つまり、重要なのは結合するときはシンプルなルールだが、参照するときは複雑ということ。"ローカルスコープに属するかどうかは「代入」した時点で決定する"というのは結合に関しては正しいが、参照に対しては間違い。挙動は、disモジュールで確認した。