有人能解释一下为什么我得到的是<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 ?
如果不是在lambda之间进行选择,而是选择第一个lambda返回的内容;在本例中,是另一个lambda。试着加上括号来说明你的意思。你知道吗
Python的操作顺序与您在这里所想的不同。看来你应该把你的定义改为
你的定义实际上是
换句话说,您正在返回一个函数,如果
foo
为真,则函数返回x+1
的值,如果为假,则返回函数lambda x: x + 2
。您真正想要的是返回两个函数中的一个,修改后的定义就是这样做的。你知道吗这个故事的寓意是:用大量的括号来表达你的意图。你知道吗
对你的问题的评论暗示了另一种可能性:
相当于
这和我的建议不一样。我的建议在执行时返回两个函数中的一个。一个函数总是加一个,另一个总是加2,返回哪个函数取决于执行定义行时
foo
的值。这里的替代方法只返回一个函数,这个函数在计算函数时根据foo
的值添加一个或两个函数。你看到区别了吗?可供选择的变化更频繁。只有你能说这些符合你的需要。你知道吗正如其他人指出的,如果这样写会更好:
但在定义了bar之后,更改foo没有任何效果,除非您以相同的方式重新定义bar。如果您只想通过更改foo获得不同的结果,请尝试以下操作:
相关问题 更多 >
编程相关推荐