lamba:getattr(obj,x)在列表中的奇怪行为

时间:2013-06-19 13:15:31

标签: python list lambda getattr

在以下示例中:

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]

为什么!?

1 个答案:

答案 0 :(得分:6)

这是lambdas的一个非常常见的问题。最终,在调用函数时查找变量x,而不是在创建函数时查找变量x。因此,在循环结束时,'prop4'的值为lambda x=x: getattr(obj,x) ,所有lambda都会给你相同的东西。

通常建议的修复方法是在lambda中使用默认参数。在创建函数时会对其进行评估。

{{1}}