このようなことをしようとすると、少し混乱します
b = [lambda x:x**i for i in range(11)]
次に試しb[1](2)
てみると、結果として1024が間違っています。でもそう書くと
b = [(lambda i: lambda x:x**i)(i) for i in range(11)]
大丈夫
>>> b[1](2)
2
>>> b[5](2)
32
正常に動作しますが、最初のコードで何が問題になっていますか?
このようなことをしようとすると、少し混乱します
b = [lambda x:x**i for i in range(11)]
次に試しb[1](2)
てみると、結果として1024が間違っています。でもそう書くと
b = [(lambda i: lambda x:x**i)(i) for i in range(11)]
大丈夫
>>> b[1](2)
2
>>> b[5](2)
32
正常に動作しますが、最初のコードで何が問題になっていますか?
これは、Python のクロージャの仕組みによるものです。
ループは、すべての関数が共有するスコープ内の値を変更します。関数の生成を別のスコープ、つまり関数に移動します。
スコープのゲームです。
最初のコードでは、ラムダの "i" 名は単なる参照です。その参照の背後にある値は、for ループが実行されると変更されます。
2 番目のコードには、2 つの異なるスコープがあります。