ここまではローカルスコープに属するかどうかは
「代入」した時点で決定する
とのことだったが、実際は違うとのこと。
まず例を見る。
>>> x = 100
>>> def aaa():
... print x
... x = 99
...
>>> aaa()
Traceback (most recent call last):
File "", line 1, in ?
File "", line 2, in aaa
UnboundLocalError: local variable 'x' referenced before assignment
>>>
aaa関数の中で2回グローバル変数と同じ名前の変数が使われている。
aaa関数ではx変数に代入しているのでaaa関数内部においてはxはローカル変数ということに
なる。よって上記のようにExceptionとなる。
代入のタイミングでローカル変数かどうか決まるのであれば、
print x
の時点のxはグローバル変数ということになるが、実際はそうでは無い。
その関数内で代入されているかどうかをPythonは静的に判断しローカル変数かどうかを決定する。
同じ名前の変数を、ローカル、グローバルと混在して使いたい場合には、完全名を指定すればよい。
>>> x = 100
>>> def aaa():
... import __main__
... print __main__.x
... x = 88
... print x
...
>>> aaa()
100
88
>>>
のようにする。
おしまい。
--
追記:2008/2/14
正しくは「参照」だか「結合」だかで厳密にルールがあるようだが、
「初めてのPyhthon」中の身としては、今のところ書籍に沿っていこうかと先に進もうかと思うのでした。
追記:2008/2/16
「オブジェクト参照」なるものも存在するとのこと。
追記:2008/2/27
疑問メモ: Pythonでは、代入は「結合」という言葉でよいのかどうか。ちょっといままでの言語のイメージと違うのでメモ。
追記:2008/2/27
疑問メモ: Pythonでは、代入のことを「定義」と言ってよいのかどうか。こちらはなんとなく良さそうな気がする。
追記:2008/2/27
気になったので調べた。
「Assignments do not copy data -- they just bind names to objects. 」とのこと。この部分の
世の中の日本語訳では「結合」という言葉が使われている模様。
Pythonでも「bind」で良いのね。ということで、ひと安心。
.
0 コメント:
コメントを投稿