1. ホーム
  2. python

[解決済み] ループ内での関数の作成

2022-07-03 17:02:12

質問

ループの中で関数を作成しようとしています。

functions = []

for i in range(3):
    def f():
        return i

    # alternatively: f = lambda: i

    functions.append(f)

問題は、すべての関数が結局同じになってしまうことです。0、1、2を返すのではなく、3つの関数がすべて2を返してしまうのです。

print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output:   [2, 2, 2]

なぜこのようなことが起こるのか、また、3種類の関数がそれぞれ0、1、2を出力するようにするにはどうしたらよいのでしょうか。

どのように解決すればよいのでしょうか?

での問題に遭遇しています。 遅延バインディング -- 各関数は i をできるだけ遅く探す(したがって、ループの終わりの後に呼ばれたとき。 i に設定されます。 2 ).

早期バインディングを強制することで簡単に修正できます。 def f():def f(i=i): のようにします。

def f(i=i):
    return i

デフォルトの値(右側の ii=i は引数名のデフォルト値 i であり、これは左側の ii=i で調べます)。 def 時間ではなく call 時間ではないので、本質的には初期のバインディングを特別に探すための方法です。

もしあなたが f が余分な引数を取る(そして潜在的に間違って呼ばれる)ことを心配するなら、クロージャを "関数ファクトリ" として使うという、より洗練された方法があります。

def make_f(i):
    def f():
        return i
    return f

で、ループの中で f = make_f(i) の代わりに def ステートメントの代わりに