为什么这个lambda函数在else语句中表现得很奇怪?

sno*_*ogg 6 python python-3.x

有人可以向我解释为什么我会<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 ? 
Run Code Online (Sandbox Code Playgroud)

Ror*_*ton 6

Python的操作顺序与您在此处的不同.看来你应该改变你的定义

bar = (lambda x: x + 1) if foo else (lambda x: x + 2)
Run Code Online (Sandbox Code Playgroud)

你实际上得到的定义是什么

bar = lambda x: (x + 1 if foo else lambda x: x + 2)
Run Code Online (Sandbox Code Playgroud)

换句话说,您正在返回一个函数,如果foo为true,则该函数返回值,x+1但如果为false,则返回该函数lambda x: x + 2.你真正想要的是返回修改后的定义所做的两个函数之一.

这个故事的寓意:用大量的括号来表达你的意图.


对您的问题的评论表明另一种可能性:

bar = lambda x: x + 1 if foo else x + 2
Run Code Online (Sandbox Code Playgroud)

这相当于

bar = lambda x: (x + 1 if foo else x + 2)
Run Code Online (Sandbox Code Playgroud)

这与我的建议不一样.我的建议在执行时会返回两个函数中的一个.一个函数总是添加一个,另一个函数总是加2,返回哪个函数取决于foo 定义行执行时的值.这里的替代方法只返回一个函数,此函数根据foo 评估函数的时间值添加一个或两个函数.你看得到差别吗?替代方案更频繁地改变.只有你可以说哪些符合你的需求.