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

Python ループで作成された関数がすべて同じ値を返すのはなぜですか?

DDD
リリース: 2024-12-22 01:57:14
オリジナル
656 人が閲覧しました

Why Do Functions Created in a Python Loop All Return the Same Value?

ループ内の関数とラムダ作成の異常

以下のコード スニペットに見られるように、ループ内で関数を生成しようとすると、特有の問題が発生します:

functions = []

for i in range(3):
    def f():
        return i
    functions.append(f)
ログイン後にコピー

同様に、を使用する場合ラムダ:

functions = []

for i in range(3):
    functions.append(lambda: i)
ログイン後にコピー

これらの関数は個別の値 (0、1、2) を出力すると予想されますが、すべての関数は最終的に同じ値 (2) を生成します。

説明と解決策

この現象は、遅延変数バインディングによって発生します。 Python 関数では、変数は呼び出し時に解決されます。つまり、ループの後に関数が呼び出されるとき、i の値はすでに 2 に設定されています。これを修正するために、f(i=i) 構文を導入することで早期バインディングを採用します。 。ここで、引数 i のデフォルト値は定義時に確立され、早期バインディングが行われます。

def f(i=i):
    return i
ログイン後にコピー

あるいは、クロージャと「関数ファクトリ」を使用したより複雑なアプローチにより、次のように早期バインディングが保証されます。さて:

def make_f(i):
    def f():
        return i
    return f
ログイン後にコピー

ループ内では、def ステートメントではなく f = make_f(i) を利用できます。

以上がPython ループで作成された関数がすべて同じ値を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート