Python:'and'运算符不返回布尔值

2nc8po8w  于 2023-02-06  发布在  Python
关注(0)|答案(4)|浏览(179)

在Python中,空列表被视为Falsey值
因此,事情应该是这样运作的:

>>> [] and False
False

但实际上,python返回的是一个空列表。

>>> [] and False
[]

这是有意的还是错误?

k4emjkb1

k4emjkb11#

这是有意的。andor都被定义为返回最后一个 * 求值 * 的值(基于短路),而不是实际的TrueFalse。对于and,这意味着它返回第一个falsy值(如果有的话)和最后一个值(不管真实性如何),如果所有其他值都是真实的话。
在添加条件表达式之前,它特别有用,因为它允许您执行一些几乎等效的黑客攻击,例如在添加条件表达式之前:

b if a else c

可以写成:

a and b or c

并且,假设b本身是某个真实的东西,那么它的行为将是等价的(条件表达式没有这个限制,并且对于意图更清楚,这就是为什么添加它)。即使在今天,这个特性偶尔对于用一些更特定类型的缺省值替换所有错误值是有用的,例如当lst可能作为Nonelist传递时,您可以确保它是list,并且:

lst = lst or []

用一个新的空list廉价地替换None(以及任何其他错误的东西)。

iyfamqjs

iyfamqjs2#

这就是它的工作原理。and只在左手操作数为真时返回右操作数。由于[]为假,and返回左操作数。

muk1a3rh

muk1a3rh3#

在Python中,对象的真实性是由内置的bool()函数决定的,该函数对于空序列返回False(如空列表、元组和字符串)和任何数值类型的零。但是,当用作and运算符的操作数时,操作数不会转换为布尔值,而是使用它们的实际值,所以在这个例子中,and运算符没有检查真实性,而是返回它遇到的第一个错误值,在这个例子中是一个空列表,所以它返回一个空列表。

af7jpaap

af7jpaap4#

这完全是意料之中的行为。要理解它,你需要知道布尔运算符(andornot)是如何工作的。
表达式x and y首先计算x;如果x为假,则返回其值;否则,计算y并返回结果值。
现在让我们考虑一下你的例子:这里,由于[]falsey,因此它的值由语句返回,返回值为[]
上面链接的Python文档明确提到:
注意:andor都不限制返回FalseTrue的值和类型,而是返回最后一个求值的参数。
但是,如果需要返回布尔值,可以使用**bool()**函数将值显式类型转换为TrueFalse
例如,在您的情况下,它将返回False:

>>> bool([] and False)
False

相关问题