有人可以向我解释为什么我得到<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 ?
答案 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)