この例を考えてみましょう
def dump(value):
print value
items = []
for i in range(0, 2):
items.append(lambda: dump(i))
for item in items:
item()
出力:
1
1
どうすれば入手することができますか:
0
1
ラムダでデフォルト値を持つパラメーターを使用できます。
for i in range(0, 2):
items.append(lambda i=i: dump(i))
これが機能するのは、関数が呼び出されたときではなく、関数が定義されたときにデフォルト値が評価されるためです。
以下を使用できます。
for i in range(0, 2):
items.append(lambda i=i: dump(i))
の現在の値を取得するi
これは、デフォルトのパラメーター値が関数の作成時に評価されi
、外部変数ではなく、デフォルトとして必要な値を持つ関数パラメーターであるため機能します。
より詳細な説明は、この回答にあります。
完全を期すために、次のこともできます。
for i in range(0, 2):
items.append((lambda i: lambda: dump(i))(i))
出力値は、関数の宣言時ではなく、関数の評価時の i の値です。それがあなたが望む結果を得られない理由です。