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循环中的参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Java的for循环、增强for循环、lambda表达式中的forEach 三种方式优缺点比较?