closureを理解していたつもりが、理解していなかった。
+1する関数を作ろうヽ(´Д`)ノ
javascript
//chromeのjavascriptコンソール function def(p){ return function(){ return p++; }; } > def10() 10 > def10() 11 > def10() 12
python2.7
http://gihyo.jp/dev/serial/01/pythonhacks/0001の記述にあるとおり、外側の変数へ代入ができないため、エラーとなる。
>>> def function(p): ... def plus(): ... p += 1 ... return p ... return plus ... >>> f10 = function(10) >>> f10() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in plus UnboundLocalError: local variable 'p' referenced before assignment
リストを利用するでエラーを回避する。
>>> def function(p): ... list = [p] ... def plus(): ... list[0] += 1 ... return list[0] ... return plus ... >>> f10 = function(10) >>> f10() 11 >>> f10() 12 >>> f10() 13
python3.0
python3.0以降は、nonlocalでできる(っぽい)
#実行したのは、python3.2 >>> def function(p): ... def plus(): ... nonlocal p ... p +=1 ... return p ... return plus ... >>> f5 = function(5) >>> f5() 6 >>> f5() 7 >>> f5() 8
lambdaを利用して短く書くこともできるようですが、ここで一旦終了です。