2017-01-30 5 views
2

なぜPythonで外側のスコープ変数

[f() for f in [lambda: d for d in [1,2]]] 

[2, 2] 

を与えますか? このような非自明な動作には、合理的な理由がいくつかありますか?この[lambda d: for d in [1,2]]

+0

パラメータの範囲は?以前の値を保持するにはクロージャが必要です。おそらく、[Pythonラムダ関数のスコープとそのパラメータ]の重複している可能性があります(http://stackoverflow.com/questions/938429/scope-of-python-lambda-functions-and-their-parameters) – Dilettant

答えて

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のための独自のデフォルト値を持っています。

+0

ほんの数秒後に;-) + 1 – Dilettant

+0

はい、ありがとうございます。私の主な質問は、それがうまくいかないことです。私は、理由が不思議なフレーズに関連する可能性があることを知っています_lexical scope_ – kakabomba

+0

ローカル変数を参照するラムダ関数を作成すると、ラムダ関数が使用する変数のコピーは作成されません。名前付き変数を参照します。この場合、その名前付き変数は、ラムダ関数が呼び出された時点で、値が2になっています。つまり、あなたの2つのラムダ関数は同じです:両方とも同じ変数dを返します。それでは、なぜ彼らの行動は違うでしょうか? – khelwood