10

重複の可能性:
ラムダ式で変数の値を使用する

私はPythonで作業しており、ラムダ関数で発生した問題を特定しようとしています。

次のコードから、2 つのラムダ関数を作成し、それぞれが異なる x を取得することを期待していました。出力は
1 2である必要があります。

しかし、出力は 2 2 です

なんで?どうすれば2つの異なる関数を作成できますか? デフを使用していますか?

def main():
    d = {}
    for x in [1,2]:
        d[x] = lambda : print(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()
4

3 に答える 3

24

lambdaコード内の の本体はname を参照しますx。その名前に関連付けられた値は、ループの次の繰り返しで変更されるため、ラムダが呼び出されて名前が解決されると、新しい値が取得されます。

期待どおりの結果を得るには、次のようxに、ループ内の の値を のパラメーターにバインドし、lambdaそのパラメーターを参照します。

def main():
    d = {}
    for x in [1,2]:
        d[x] = lambda x=x: print(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()

>>> 
1
2
于 2012-07-30T14:14:31.467 に答える
8

の仕事のようですpartial

from functools import partial 
def main():
    d = {}
    for x in [1,2]:
        d[x] = partial(lambda x: print(x), x=x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()
于 2012-07-30T14:23:35.200 に答える
4

これで修正されます。これは、x がラムダに直接バインドされているためです。

def create_lambda(x):
    return lambda : print(x)

def main():
    d = {}
    for x in [1,2]:
        d[x] = create_lambda(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()
于 2012-07-30T14:13:50.097 に答える