Python ではネストした関数を記述でき,その関数から外側のブロックの変数が見える.
しかし読むことはできても書くことはできない(!!).しかも,書くとエラーになるのではなく,内側のブロックにローカル変数を作成してしまい,その関数を呼ぶと「初期化する前に参照」などのわかりにくいエラーが発生する.
def f(): def g(): if first: print "first" first = False else: print "not first" first = True g()
は 3 行目で実行時エラー.
謎な点:
g()
のfirst = False
を消すとエラーが出なくなる.ということは文first = False
をバイトコンパイル時に読んでレキシカルにローカル変数を作成しているわけだが,このようなことはドキュメントのどこに記述してあるのか?
Effective Python/スコープと名前空間 によると Python 3 では nonlocal
なるステートメントが用意されて,外側のローカル変数も書けるようになるらしい.
0 件のコメント:
コメントを投稿