所有:
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列表.
我可以在这里获得这个片段的帮助吗?
谢谢!
正如其他答案所指出的那样,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)