编程语言
首页 > 编程语言> > 在循环中在python中调整函数

在循环中在python中调整函数

作者:互联网

所以这里有一些代码简化了我一直在做的工作:

vars = {
    'a':'alice',
    'b':'bob',
}
cnames = ['charlie', 'cindy']

commands = []

for c in cnames:
    kwargs = dict(vars)
    kwargs['c'] = c
    print kwargs
    commands.append(lambda:a_function(**kwargs))

print commands

def a_function(a=None, b=None, c=None):
    print a
    print b
    print c

for c in commands:
    print "run for "+ repr(c)
    c()

这是它的输出:

{'a': 'alice', 'c': 'charlie', 'b': 'bob'}
{'a': 'alice', 'c': 'cindy', 'b': 'bob'}
[<function <lambda> at 0x1001e9a28>, <function <lambda> at 0x1001e9e60>]
run for <function <lambda> at 0x1001e9a28>
alice
bob
cindy
run for <function <lambda> at 0x1001e9e60>
alice
bob
cindy

我希望得到查理,然后cindy,为什么cindy被展示两次?

解决方法:

在调用函数之前,函数的主体不会运行.当你执行lambda:a_function(** kwargs)时,在实际调用函数之前不会查找kwargs.此时,它被分配给您在循环中创建的最后一个.

获得所需结果的一个解决方案是执行commands.append(lambda kwargs = kwargs:a_function(** kwargs))

标签:python,lambda,currying
来源: https://codeday.me/bug/20190724/1518420.html