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

这是 lambda 的一个非常常见的问题。最终,变量x是在调用函数时查找的,而不是在创建时查找的。因此,在循环结束时, is 的值x'prop4'所有 lambda 表达式都会给你同样的东西。

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

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