ループ内での関数作成の処理: 遅延バインディングのトラブルシューティング
ループ内で関数を作成しようとすると、一般的な問題が発生します。示されている例では、それぞれ 0、1、2 を返す 3 つの関数を生成することが目標です。ただし、3 つの関数はすべて同じ値 (2) を返します。これは、遅延バインディングが原因で発生します。この場合、関数は変数 'i' の評価を可能な限り最後の瞬間まで延期します。
遅延バインディングについて
修正なしのコード内:
for i in range(3): def f(): return i
各 'f' は検索します'i' はループの実行の後半で、その時点で 'i' は最終値 2 に達しています。その結果、ループが 0、1、2 を返す関数を作成するつもりであるにもかかわらず、3 つの関数はすべて 2 を返します。
問題の解決
この問題の解決策は、早期に強制することですバインディング。これは、次のように「i」を引数として「f」関数に渡すことで実現できます。
for i in range(3): def f(i=i): return i
この更新されたコードでは、ループが実行される定義時に「i」が検索されます。 'f' が実行される呼び出し時ではなく。
を使用した代替解決策クロージャ
別のアプローチは、クロージャを使用して「関数ファクトリー」を作成することです。
def make_f(i): def f(): return i return f
ループ内で、「f = make_f」を使用して「f」を作成できます。 (私)'。このアプローチでは、関数 'make_f' が定義時に 'i' の値を 'f' に渡すため、早期バインディングも保証されます。
以上がループ内で作成された関数が時々間違った値を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。