3 回答

TA贡献1852条经验 获得超7个赞
什么都没有被转换;Python布尔逻辑运算符反而会短路。
请参阅布尔运算符文档:
表达式
x and y
首先求值x
; 如果x
为false,则返回其值;否则为false。否则,y
将求值并返回结果值。表达式
x or y
首先求值x
; 如果x
为true,则返回其值;否则为false。否则,y
将求值并返回结果值。
此外,等于的数字0
以及空的字符串和容器都被认为是错误的。引用同一文档:
在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值将解释为false:
False
,,None
所有类型的数字零以及空字符串和容器(包括字符串,元组,列表,字典,集合和Frozensets)。
结合这两种行为意味着,对于0 and False
,会0
被视为false并在评估False
表达式之前返回。对于表达式True and 0
,True
被求值并发现它是一个真值,因此0
将其返回。就if
andwhile
和其他布尔运算符而言,该结果0
也被认为是错误的。
您可以使用它来提供默认值,例如:
foo = bar or 'default'
要将非布尔值真正转换为布尔值,请使用bool()
type;它使用与布尔表达式相同的规则来确定输入的布尔值:
>>> bool(0)
False
>>> bool(0.0)
False
>>> bool([])
False
>>> bool(True and 0)
False
>>> bool(1)
True
为了使图片更完整,在布尔上下文中不被视为false的值将被视为true,包括任何自定义类。您可以通过在类上实现一个.__nonzero__()特殊的方法来更改它。如果未定义此类方法,.__len__()则也请参考。使用这两种方法中的任何一种,您都可以发出信号,表明您的类型是数字,并且True如果非零,则应考虑该类型;或者,它是一个容器,并且True如果不为空(长度超过0),则应考虑该类型。

TA贡献1844条经验 获得超8个赞
那是因为0它本身就是虚假的价值。
>>> bool(0)
False
>>> bool(1)
True
0 and True
是0
因为0
是Falsy,AND
条件一旦找到第一个falsy值便立即停止执行并返回该值。如果所有值均为True,则返回最右边的值。
OR
将继续检查值,直到True
找不到first为止,否则它将返回最后一个值。
来自docs
:
可以测试任何对象的真值,以在if或while条件中使用,或用作以下布尔运算的操作数。以下值被认为是错误的:
没有
错误的
任何数字类型的零,例如
0, 0L, 0.0, 0j
。任何空序列,例如
'', (), []
。任何空映射,例如
{}
。用户定义的类的实例,如果该类定义了
__nonzero__()
或__len__()
方法,则该方法返回整数零或布尔值False时。
所有其他值都被认为是真实的-因此许多类型的对象总是真实的。
除非另有说明,否则具有布尔结果的操作和内置函数始终返回0或False表示false,返回1或True表示true。(重要的例外:布尔运算符or和and始终返回其操作数之一。)
添加回答
举报