我试图在这样的函数中返回一个布尔值:
return mylist and any(condition(x) for x in mylist)
如果列表是空的,或者其中的任何元素满足条件,则行为应该是返回True
。我使用第一个操作数作为短路,因为如果列表为空,any
将返回True
,这不是我想要的。
我希望[] and boolval
返回False
,因为列表是空的,但令我惊讶的是,它返回[]
,无论boolval
是True
还是False
。我希望第一个操作数会自动作为布尔值计算,因为它涉及比较操作,而不是正在发生的任何事情。
我并不是真正地问如何解决我的问题,这很容易通过显式类型转换:bool(mylist)
来完成,而是询问正在发生什么以及为什么发生。
编辑:当我问“为什么”会发生这种情况时,我并不仅仅是在寻找“事实”,因为它们已经在链接的重复问题中得到了解释,但也找到了实现这种行为的原因。
发布于 2018-10-02 09:22:39
and
和or
运算符不返回True/False
。他们返回--最后一个被评估为的东西(在其他动态语言中也是如此,例如。( javascript)
The 官方文件描述
and
,第一个假值或最后一个操作数or
,第一个真实值或最后一个操作数这是由设计完成的,所以您可以创建像return username or 'guest'
这样的表达式。因此,如果要保证返回布尔值,则必须
return bool(x or y)
而不是
return x or y
发布于 2018-10-02 09:22:18
因为正如khelwood所说:
如果
x and y
是falsey,则给x
,否则就给y
。
这就是重点,(and
不是or
:-),所以最好还是:
return all([my_list,any(condition(x) for x in my_list)])
发布于 2018-10-02 09:33:38
这与python如何计算表达式有关。
python认为空列表为false,这意味着“和”之后的代码不会被执行,因为这不会改变结果。
Python不需要将空列表转换为bool,因为它不与任何东西相比较,只需将其作为空列表返回即可。
这不应该为您改变任何东西,如果您测试函数的返回值,它的计算方式将与函数返回False的方式相同。
https://stackoverflow.com/questions/52605441
复制相似问题