メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年2月14日木曜日

[Python][お勉強] Python入門(33) - 変数がローカルスコープに属するかどうかの内部的判断

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


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

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

まず例を見る。

>>> 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 コメント: