Python lambda不记得for循环中的参数[重复]

Posted

技术标签:

【中文标题】Python lambda不记得for循环中的参数[重复]【英文标题】:Python lambda doesn't remember argument in for loop [duplicate] 【发布时间】:2012-07-28 05:20:15 【问题描述】:

可能重复:Use value of variable in lambda expression

我正在使用 python 并试图找出我在使用 lambda 函数时遇到的问题。

从下面的代码中,我期望创建两个 lambda 函数,每个函数都有一个不同的 x,输出应该是 1 2

但输出是 2 2

为什么? 我怎样才能制作两个不同的功能?使用定义?

def main():
    d = 
    for x in [1,2]:
        d[x] = lambda : print(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()

【问题讨论】:

羔羊使用不当。它只返回打印的轮值,即无。打印应该是一个命令而不是一个表达式。 【参考方案1】:

代码中lambda 的主体引用了名称x。与该名称关联的值在循环的下一次迭代中更改,因此当调用 lambda 并解析名称时,它会获得新值。

为了达到你期望的结果,将循环中x的值绑定到lambda的一个参数上,然后引用该参数,如下所示:

def main():
    d = 
    for x in [1,2]:
        d[x] = lambda x=x: print(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()

>>> 
1
2

【讨论】:

我认为只有 Python 3k+...在 P2.7 中不起作用(对我来说),但在 P3.2 和 P3.3 中起作用 @drewk:这个答案适用于自引入lambda以来的任何Python。 @drewk 好点:区别在于 print 是 Python lambda 中是不允许的。它是 Python 3 中的一个函数,因此在那里是允许的。 如果您真的担心 lambda 中的 print,请使用 sys.stdout.write(x+"\n") 虽然答案代码没有错,但我建议将 lambda 中的绑定变量更改为其他名称。为了提高清晰度。我建议:d[x] = lambda y=x: print(y)。 (我尝试编辑帖子,但不允许编辑少于 6 个字符)【参考方案2】:

看起来像 partial 的工作。

from functools import partial 
def main():
    d = 
    for x in [1,2]:
        d[x] = partial(lambda x: print(x), x=x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()

【讨论】:

+1。执行此操作的简单方法是将其写为d[x] = lambda x=x: print(x)。但是,partial 允许您锁定参数。这可能写成d[x] = partial(print, x) 更好,因为print 是一个函数。无需将其包装在 lambda 中。 您的评论很棒!我写了lambda,引起关于lambda 的问题:)【参考方案3】:

这将解决它。这是因为 x 直接绑定到 lambda。

def create_lambda(x):
    return lambda : print(x)

def main():
    d = 
    for x in [1,2]:
        d[x] = create_lambda(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()

【讨论】:

以上是关于Python lambda不记得for循环中的参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

for循环中的lambda只取最后一个值[重复]

for循环中的lambda只取最后一个值[重复]

for循环中的lambda只取最后一个值[重复]

Java的for循环、增强for循环、lambda表达式中的forEach 三种方式优缺点比较?

如何创建 lambda 列表(在列表理解/for 循环中)?

如何创建 lambda 列表(在列表理解/for 循环中)?