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 なるステートメントが用意されて,外側のローカル変数も書けるようになるらしい.
