lambda推送到列表然后调用 - 输出不是预期的

use*_*514 3 python lambda

所有:

def a(p): 
    return p+1 

def gen(func, k=100): 
    l= [] 
    for x in range(k): 
       temp = ("%s_with_parameter_%s" %(func.__name__, x), lambda: func(x)) 
       # maybe this will be more clear to explain my quetion: 
       # i want to get list/dict which can bind self-defined string and function together 
       l.append(temp) 
    return l 

l = gen(a, 100) 

for x in range(len(l)): 
   l[x][1]()                

100
100
100
100
100
100
100
100
Run Code Online (Sandbox Code Playgroud)

...我想输出将是1 to 101打印输出,但它显示了一个100列表.

我可以在这里获得这个片段的帮助吗?

谢谢!

aar*_*ing 6

正如其他答案所指出的那样,lambdas正在使用x的最后一个值,因为它们已经关闭了它,所以看到对它做出的任何更改.诀窍是将它们绑定到值.

您可以通过编写它们来完成此操作

lambda x=x: func(x)
Run Code Online (Sandbox Code Playgroud)

x当将lambda创建为默认参数p时,这会绑定当前值,这意味着lambda不再是闭包,x并且不会受到其值的任何未来更改的影响.你会改变你调用它的方式,不传递你不做任何事情的参数:

for x in range(len(l)):
   l[x][1]()
Run Code Online (Sandbox Code Playgroud)

现在,lambda使用默认值绑定到您想要的值.

如果你确实需要传入一个值,那么你可以在'real'参数之后粘贴用于绑定目的的默认参数:

lambda p, x=x: func(p, x)
Run Code Online (Sandbox Code Playgroud)