Pythonでプログラムを書いていると、よく関数の中で関数を作ることがあります。
Python はクロージャに対応していて、関数の中で作られた関数は、外側の関数のローカル変数を参照することができます。
クロージャが一番役に立つ場面がデコレータです。次の例では、引数を取るデコレータを作るために関数内関数を2段階作成し、それぞれのローカル変数を一番内側から参照しています(このプログラムは、Python 2.6とPython 3.0の両方で動きます)。
Pythonのクロージャには、外側の変数への代入ができないという制限がありました。ためしに、リスト1のdecorator関数に、関数を呼び出した回数をカウントする機能をつけてみます。
Pythonでは、代入=ローカル変数の宣言になるので、上の例では called += 1 しようとしたときにcalledはdecoratedのローカル変数という扱いになり、未初期化変数へ加算代入しようとしたのでエラーになってしまいます。
このような場合、従来では更新したい値を変数に入れる代わりにリストに入れる、といったテクニックを利用する必要がありました。
Python 3.0ではnonlocalというキーワードが導入され、外側の変数の更新が可能になりました。nonlocalの使い方はglobalキーワードと同じです。
この制限は、Python以外の言語でクロージャに慣れ親しんだ人がPythonで同じ事をしようとすると、必ずつまずくポイントでした。 nonlocalの導入により、クロージャがいっそう便利になります。