ループ内で関数またはラムダを作成するときは、概念を考慮することが重要です後期バインディングの。指定された例では:
functions = [] for i in range(3): def f(): return i functions.append(f)
各関数は、ループが終了した後、できるだけ遅く i の値を検索します。その結果、すべての関数は i の最終値 2 を返します。
この問題を修正して、0、1、2 を出力する 3 つの異なる関数を取得するには、早期バインディングを強制する必要があります。これは、デフォルト パラメータを使用することで実現できます:
functions = [] for i in range(3): def f(i=i): # Default parameter for i return i functions.append(f)
この場合、デフォルト パラメータ i は呼び出し時ではなく定義時に評価され、各関数が i の正しい値を使用することが保証されます。
あるいは、関数ファクトリを使用して、早期バインディングで関数を作成することもできます。
def make_f(i): def f(): return i return f functions = [] for i in range(3): functions.append(make_f(i))
make_f 関数は、正しい関数を使用して新しい関数を作成します。 i の値は早期にバインドされます。
以上がループ内で作成された関数が同じ値を返すのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。