ループ内の関数とラムダ作成の異常
以下のコード スニペットに見られるように、ループ内で関数を生成しようとすると、特有の問題が発生します:
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 サイトの他の関連記事を参照してください。