我试图在这样的函数中返回一个布尔值:
return mylist and any(condition(x) for x in mylist)
Run Code Online (Sandbox Code Playgroud)
True如果列表为空或者其中的任何元素满足条件,则应该返回行为.我使用第一个操作数作为短路,因为如果列表为空则any返回True,这不是我所追求的.
我希望[] and boolval返回False,因为该列表是空的,但让我吃惊,它返回[]是否boolval是True或False.我希望第一个操作数被自动计算为布尔值,因为它涉及比较操作,而不是发生的任何事情.
我并不是真的在问如何解决我的问题,这可以通过显式类型转换轻松完成:bool(mylist)而是询问发生了什么以及为什么.
编辑:当我问"为什么"这种情况发生时,我不仅仅在寻找"事实",因为它们已经在链接的重复问题中进行了解释,而且还有实施此行为背后的原因.
在and与or运营商没有返回True/False.它们返回最后评估的东西(在其他动态语言中也是如此,例如.javascript).
and,第一个falsy值,或最后一个操作数or,第一个truthy值,或最后一个操作数这是设计,所以你可以创建像这样的表达式return username or 'guest'.所以,如果你想保证返回一个布尔值,你必须这样做
return bool(x or y)
Run Code Online (Sandbox Code Playgroud)
代替
return x or y
Run Code Online (Sandbox Code Playgroud)