2

たとえば、関数の配列があります。

>>> def f():
...     print "f"
... 
>>> def g():
...     print "g"
... 
>>> c=[f,g]

次に、2 つのラムダ関数を作成しようとします。

>>> i=0
>>> x=lambda: c[i]()
>>> i+=1
>>> y=lambda: c[i]()

そして、それらを呼び出します:

>>> x()
g
>>> y()
g

ラムダの c[i] が同じなのはなぜですか?

4

2 に答える 2

10

これは、ラムダ関数がi実行時にグローバル変数の値を取得しているためです。

>>> i = 0
>>> x=lambda z = i : c[z]() #assign the current value of `i` to a local variable inside lambda
>>> i+=1
>>> y =lambda z = i : c[z]()
>>> x()
f
>>> y()
g

必読: (ラムダ) 関数クロージャは何をキャプチャしますか?

于 2013-05-26T20:44:24.583 に答える
3

Python クロージャは実際の値をキャプチャしませんが、代わりに名前空間をキャプチャします。したがってi、関数内で使用すると、実際には囲んでいるスコープで検索されます。そして、そこにある価値はすでに変化しています。

lambdaこれを確認するために、これらすべての とリストは必要ありません。

>>> x = 1
>>> def f():
...   print(x)
...
>>> x = 2
>>> def g():
...   print(x)
...
>>> g()
2
>>> f()
2
于 2013-05-26T20:59:17.873 に答える