1

このようなことをしようとすると、少し混乱します

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

正常に動作しますが、最初のコードで何が問題になっていますか?

4

2 に答える 2

3

これは、Python のクロージャの仕組みによるものです。

ループは、すべての関数が共有するスコープ内の値を変更します。関数の生成を別のスコープ、つまり関数に移動します。

于 2010-02-14T16:45:49.470 に答える
1

スコープのゲームです。

最初のコードでは、ラムダの "i" 名は単なる参照です。その参照の背後にある値は、for ループが実行されると変更されます。

2 番目のコードには、2 つの異なるスコープがあります。

于 2010-02-14T16:48:33.210 に答える