ホームページ >バックエンド開発 >Python チュートリアル >ループ内で作成された関数が時々間違った値を返すのはなぜですか?

ループ内で作成された関数が時々間違った値を返すのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-27 18:11:15366ブラウズ

Why Do Functions Created in Loops Sometimes Return the Wrong Values?

ループ内での関数作成の処理: 遅延バインディングのトラブルシューティング

ループ内で関数を作成しようとすると、一般的な問題が発生します。示されている例では、それぞれ 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。