lexical closureの続き: 「ダブルラムダ」でpythonにloop変数を覚えさせる。

shota243さんのダブルlambda

コメントから:
「ループの『変数』を覚えているから lambda の外でその変数の値が変われば変わった値を取ってきます。lambdaを作成されたときの値を覚えておくためにはそのための変数をそれぞれ作成してその変数を覚えさせる必要があります。」


closures=[]
for i in range(5):
closures.append(
(lambda x: # <--このスコープにiの個々の値を覚えさせるんだな。
lambda: "foo"+str(x)
)(i)
)
for f in closures:
print f()


覚えさせる分、余分にlambdaでスコープを作ったってことかな。
面白い技を教わってしまった。shota243さん、ありがとう。

ダブルラムダのcommon lisp

shiroさんから頂いたコメントのコードを変更してみた。


(let ( (closures (loop for i below 5 collect
( (lambda (x) (lambda () x)) i))))
(dolist (f closures)
(format t "~%foo~a" (funcall f))))

$ sbcl --noinform --load loop.lisp
foo0
foo1
foo2
foo3
foo4