有人可以向我解释为什么我会<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)
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
评估函数的时间值添加一个或两个函数.你看得到差别吗?替代方案更频繁地改变.只有你可以说哪些符合你的需求.