为什么此lambda函数在else语句中表现怪异?

时间:2018-07-15 16:33:36

标签: 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 ? 

3 个答案:

答案 0 :(得分:6)

Python的操作顺序与您在此处想的不同。看来您应该将定义更改为

CHARACTER SET

定义的实际含义是

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

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

这个故事的寓意:用大量的括号使你的意图清楚。


对您的问题的评论提出了另一种可能性:

lambda x: x + 2

等效于

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

这与我的建议不同。我的建议在执行时返回两个函数之一。一个函数总是加一个,另一个函数总是加2,返回哪个函数取决于bar = lambda x: (x + 1 if foo else x + 2) 执行定义行时的值。这里的替代方法仅返回一个函数,并且该函数根据评估函数时foo 的值添加一个或两个。你看得到差别吗?替代方案更频繁地更改。只有您能说出其中哪一个满足您的需求。

答案 1 :(得分:0)

如果您没有在lambda之间进行选择,则选择的是第一个lambda返回的内容;在这种情况下,另一个lambda。尝试添加括号以弄清楚您的意思。

答案 2 :(得分:0)

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

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)