3

重複の可能性:
(ラムダ) 関数クロージャーは Python で何をキャプチャしますか?

いくつかのラムダ関数を辞書に入れるこのpythonコードがあります:

dictfun = dict()
for txt in ("a", "b", "c"):
    dictfun[txt] = lambda: "function " + txt

これらの関数は、呼び出された引数を含む文字列を返すだけです。for 、forなど
の出力が表示されることを期待していましたが、次のようになります。function adictfun["a"]()function bdictfun["b"]()

>>> dictfun["a"]()
'function c'
>>> dictfun["b"]()
'function c'
>>> dictfun["c"]()
'function c'

それらはすべてtxt、設定された最後の値、つまり現在の値に評価されるようです。つまり、変数はラムダに閉じられていません。私もこれを行うことができます:

>>> txt = "a"
>>> dictfun["c"]()
'function a'

txt期待される出力を得るためにラムダ関数に近づくにはどうすればよいですか?

4

1 に答える 1

5

txtの値をデフォルト値としてキーワード引数に設定できます。

dictfun = dict()
for txt in ("a", "b", "c"):
    dictfun[txt] = lambda txt=txt: "function " + txt
于 2012-11-08T11:40:06.900 に答える