我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:
functions = []
for i in range(3):
    def f():
        return i
    # alternatively: f = lambda: i
    functions.append(f)
这输出:
print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output:   [2, 2, 2]
知道为什么吗?
我正在使用list comprehension中的lambda函数,并发现了一些奇怪的行为
x = [(lambda x: i) for i in range(3)]
print(x[0](0)) #print 2 instead of 0
print(x[1](0)) #print 2 instead of 1
print(x[2](0)) #print 2
有人可以解释为什么结果不是我所期望的吗?
def multipliers():
    return [lambda x: i * x for i in range(4)]
print([m(1) for m in multipliers()]) # [3, 3, 3, 3]
为什么不是[0, 1, 2, 3]?无法理解。那么,出于某种原因,我们i = 3在所有 lambda 表达式中都有?为什么?
我不理解一段代码的行为,涉及一个在不同对象中调用方法的lambda函数的理解列表.它发生在一个大型程序中,所以对于这个问题,我做了一个荒谬的玩具案例来表明我的观点:
class Evaluator(object):
    def __init__(self, lft, rgt):
        self.lft = lft
        self.rgt = rgt
    def eval(self, x):
        return self.lft + x * (self.rgt - self.lft)
if __name__ == "__main__":
    ev1 = Evaluator(2, 3)
    ev2 = Evaluator(4, 5)
    ev3 = Evaluator(6, 7)
    funcs = [lambda x:ev.eval(x+0.1) for ev in (ev1, ev2, ev3)]
    print([f(0.5) for f in funcs])
我得到的输出是[6.6, 6.6, 6.6],这意味着它是ev3一直被评估的方法.而不是[2.6, 4.6, 6.6]像我期望的那样.但令我惊讶的是,如果我摆脱lambda函数,行为就好了:
class Evaluator(object):
    def __init__(self, lft, rgt):
        self.lft = lft
        self.rgt = rgt
    def eval(self, …考虑以下代码:
def f (a):
    return 1
def g (a):
    return 2
[lambda a: i(a) for i in (f,g)][0](0)
结果是 2。它显然应该是 1!我希望这段代码执行如下。创建一个列表。将函数 f 复制到第一个索引中。将 g 复制到第二个索引中。鳍。
为什么会这样执行?!
在以下示例中:
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]
为什么!?