なぜPythonで外側のスコープ変数
[f() for f in [lambda: d for d in [1,2]]]
は
[2, 2]
を与えますか? このような非自明な動作には、合理的な理由がいくつかありますか?この[lambda d: for d in [1,2]]
で
なぜPythonで外側のスコープ変数
[f() for f in [lambda: d for d in [1,2]]]
は
[2, 2]
を与えますか? このような非自明な動作には、合理的な理由がいくつかありますか?この[lambda d: for d in [1,2]]
で
何を持っていることは、「私に関数が呼び出された時点でd
の値を返す関数を与え、1 2からd
を実行する。」
です
2つの関数のリストが構築された後、[f() for f in that list]
を呼び出します。現時点では、関数が呼び出され、d in [1,2]
は既に完了しており、d
の最終値は2
です。したがって、両方の関数は2
を返します。
異なる結果を得る1つの方法は、作成するラムダ関数ごとに変数にd
をコピーすることです。そのための最も簡単な方法は、次のとおりです。
[f() for f in [lambda x=d: x for d in [1,2]]]
ここで各lambda
は、関数が作成された時点でd
である、x
のための独自のデフォルト値を持っています。
ほんの数秒後に;-) + 1 – Dilettant
はい、ありがとうございます。私の主な質問は、それがうまくいかないことです。私は、理由が不思議なフレーズに関連する可能性があることを知っています_lexical scope_ – kakabomba
ローカル変数を参照するラムダ関数を作成すると、ラムダ関数が使用する変数のコピーは作成されません。名前付き変数を参照します。この場合、その名前付き変数は、ラムダ関数が呼び出された時点で、値が2になっています。つまり、あなたの2つのラムダ関数は同じです:両方とも同じ変数dを返します。それでは、なぜ彼らの行動は違うでしょうか? – khelwood
パラメータの範囲は?以前の値を保持するにはクロージャが必要です。おそらく、[Pythonラムダ関数のスコープとそのパラメータ]の重複している可能性があります(http://stackoverflow.com/questions/938429/scope-of-python-lambda-functions-and-their-parameters) – Dilettant