为什么这个lambda函数在else语句中的行为异常?

2024-04-20 14:07:07 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能解释一下为什么我得到的是<function <lambda>.<locals>.<lambda> at 0x0000000002127F28>而不是3?你知道吗

>>> foo = True
>>> bar = lambda x: x + 1 if foo else lambda x: x + 2
>>> bar(1)
2

>>> foo = False
>>> bar = lambda x: x + 1 if foo else lambda x: x + 2
>>> bar(1)
<function <lambda>.<locals>.<lambda> at 0x0000000002127F28>   # Hey !? WTF ? 

Tags: lambdafalsetrueiffoobarfunctionelse
3条回答

如果不是在lambda之间进行选择,而是选择第一个lambda返回的内容;在本例中,是另一个lambda。试着加上括号来说明你的意思。你知道吗

Python的操作顺序与您在这里所想的不同。看来你应该把你的定义改为

bar = (lambda x: x + 1) if foo else (lambda x: x + 2)

你的定义实际上是

bar = lambda x: (x + 1 if foo else lambda x: x + 2)

换句话说,您正在返回一个函数,如果foo为真,则函数返回x+1的值,如果为假,则返回函数lambda x: x + 2。您真正想要的是返回两个函数中的一个,修改后的定义就是这样做的。你知道吗

这个故事的寓意是:用大量的括号来表达你的意图。你知道吗


对你的问题的评论暗示了另一种可能性:

bar = lambda x: x + 1 if foo else x + 2

相当于

bar = lambda x: (x + 1 if foo else x + 2)

这和我的建议不一样。我的建议在执行时返回两个函数中的一个。一个函数总是加一个,另一个总是加2,返回哪个函数取决于执行定义行时foo的值。这里的替代方法只返回一个函数,这个函数在计算函数时根据foo的值添加一个或两个函数。你看到区别了吗?可供选择的变化更频繁。只有你能说这些符合你的需要。你知道吗

正如其他人指出的,如果这样写会更好:

bar = (lambda x: x + 1) if foo else (lambda x: x + 2)

但在定义了bar之后,更改foo没有任何效果,除非您以相同的方式重新定义bar。如果您只想通过更改foo获得不同的结果,请尝试以下操作:

bar = lambda x: (x + 1 if foo else x + 2)

相关问题 更多 >