0

次の例では:

class A(object):
    pass
    prop1 = 1
    prop2 = 2
    prop3 = 3
    prop4 = 4

obj = A()
tmp = ['prop1', 'prop2', 'prop3', 'prop4']
getter = [ lambda: getattr(obj, x) for x in tmp ]

4を呼び出すと、常に取得していgetterます:

[getter[i]() for i in range(4)]
#[4, 4, 4, 4]

どうして!?

4

1 に答える 1

6

これは、ラムダで非常に一般的な問題です。最終的に、変数xは作成時ではなく、関数の呼び出し時に検索されます。そのため、ループの最後にxisの値'prop4'とすべてのラムダが同じ結果を返します。

一般的に提案されている修正は、ラムダでデフォルトの引数を使用することです。関数の作成時に評価されます。

lambda x=x: getattr(obj,x)
于 2013-06-19T13:17:08.780 に答える