我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:
functions = []
for i in range(3):
def f():
return i
# alternatively: f = lambda: i
functions.append(f)
Run Code Online (Sandbox Code Playgroud)
这输出:
print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output: [2, 2, 2]
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
我正在使用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
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么结果不是我所期望的吗?
def multipliers():
return [lambda x: i * x for i in range(4)]
print([m(1) for m in multipliers()]) # [3, 3, 3, 3]
Run Code Online (Sandbox Code Playgroud)
为什么不是[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])
Run Code Online (Sandbox Code Playgroud)
我得到的输出是[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, …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
def f (a):
return 1
def g (a):
return 2
[lambda a: i(a) for i in (f,g)][0](0)
Run Code Online (Sandbox Code Playgroud)
结果是 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 ]
Run Code Online (Sandbox Code Playgroud)
我总是4在打电话给getter:
[getter[i]() for i in range(4)]
#[4, 4, 4, 4]
Run Code Online (Sandbox Code Playgroud)
为什么!?