スコープの決定方法
- とりあえず: [Python][お勉強] Python入門(33) - 変数がローカルスコープに属するかどうかの内部的判断 (http://atkonn.blogspot.com/2008/02/python-python33.html)
ここまではローカルスコープに属するかどうかは
「代入」した時点で決定する
とのことだったが、実際は違うとのこと。
...(snip)...
代入のタイミングでローカル変数かどうか決まるのであれば、
print x
の時点のxはグローバル変数ということになるが、実際はそうでは無い。
その関数内で代入されているかどうかをPythonは静的に判断しローカル変数かどうかを決定する。
読んだとき結構曖昧だったので私のPythonの理解を以下に示す。
- 変数がどのスコープに属するかは、どの位置で最初に変数に値を結合したかで決まる
- ローカル変数を参照するときに...
- カレントスコープに変数が定義されていたら、ローカル変数を定義した位置に関わらず(つまりprintの後で定義されたとしても)その変数を参照する
- カレントスコープに変数が定義されていなかったら、LEGBルールでサーチを続ける
- 変数が見つからなかったらエラー
つまり、重要なのは結合するときはシンプルなルールだが、参照するときは複雑ということ。"ローカルスコープに属するかどうかは「代入」した時点で決定する"というのは結合に関しては正しいが、参照に対しては間違い。挙動は、disモジュールで確認した。