用語

Pythonクロージャ内の変数に一般的な名前が付いていないので、以下の挙動を説明する時に困る。

>>> L = [lambda: x for x in range(3)]
>>> L[0](), L[1](), L[2]()
(2, 2, 2)
>>> L = [lambda x=x: x for x in range(3)]
>>> L[0](), L[1](), L[2]()
(0, 1, 2)

前者のlambdaはクロージャで、後者は関数である。なので、挙動に違いが出る。この時、前者のxをクロージャ内の変数xと表現するしかないが、一般的な名前が付いていれば説明しやすいし、挙動も意識出来るので把握しやすいと思う。


初めてのPython本では、変数のスコープルールに、LEGBルールというのがある。この場合のEが、これに当たる。Enclosedだと思うので、直訳すると閉変数とか内包変数だろうか?あと、素直にクロージャ変数というのはどうだろう?(クロージャオブジェクトと区別が付きにくいか…。)ノンローカル変数というのもありかもしれないが、nonlocalを付けた場合と付けない場合の区別がしにくい。あと悪い例だが意味的に環境変数とか。とりあえず自分としては内包変数とでも呼んでおこうかな。


追記(2011/2/10):
グローバル変数もglobalと付ける場合と付けない場合があるが、その名前が付いているので、nonlocalを付ける場合と付けない場合があっても、名前としては、ノンローカルの方が内包変数より良いかも。とりあえず、ノンローカル変数とでも呼んでおくことにしよう。