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を利用して短く書くこともできるようですが、ここで一旦終了です。

Read and Post Comments