奇怪的转换表达式

问题描述:

我注意到的Python 2.7逻辑表达式的一个奇怪的现象:在地方的假奇怪的转换表达式

 
>>> 0 and True 
0 
>>> True and 0 
0 
>>> 1 and True 
True 
>>> True and 1 
1 

 
>>> 0 and False 
0 
>>> False and 0 
False 
>>> 1 and False 
False 
>>> False and 1 
False 

,并与真有没有在Python的转换逻辑语句的任何规则整数?为什么它有时会显示0虚假和1虚设为真?

更重要的是,为什么它会返回?

 
>>>"test" or "test" 
'test' 
+1

'>>>布尔( 'X')''是TRUE' – 2013-05-11 11:27:42

没有被转换; Python布尔逻辑运算符代替短路

boolean operators documentation

表达x and y首先评估x;如果x为假,则返回其值;否则,将评估y并返回结果值。

表达式x or y首先评估x;如果x为真,则返回其值;否则,将评估y并返回结果值。

此外,等于0的数字被认为是错误的,正如空字符串和容器一样。从相同的文档引用:

在布尔操作的上下文中,以及当表达式通过控制流语句中使用的,下面的值被解释为假:FalseNone,所有类型的数字零,并且空字符串和容器(包括字符串,元组,列表,字典,集合和frozensets)。

结合这两种行为意味着,对于0 and False,所述0考虑假和评估False表达之前返回。对于表达式True and 0True进行评估并发现它是一个真实值,因此将返回0。就ifwhile和其他布尔运算符而言,该结果0也被认为是错误的。

您可以使用它来提供例如默认值:

foo = bar or 'default' 

要真正转换为非布尔值转换成布尔使用bool() type;它使用相同的规则布尔表达式来确定输入的布尔值:

>>> bool(0) 
False 
>>> bool(0.0) 
False 
>>> bool([]) 
False 
>>> bool(True and 0) 
False 
>>> bool(1) 
True 

要完成图片,未在布尔上下文认为是假值,而不是真正的考虑,包括任何自定义类。您可以通过在班上实施.__nonzero__() special method来改变这种情况。如果没有定义这样的方法,也请咨询​​。使用这两种方法中的任何一种,您都可以发出信号,表明您的类型是数字,如果不是零,则应视为True,或者它是一个容器,如果不是空(长度大于0),则应视为True

+0

但是为什么“True和0”不是False,而是0? – 2013-05-11 11:44:32

+2

@ bzxcv17:同样,短路;第一个表达式('True')是一个真值,因此返回第二个值。 “0”被认为是错误的,所以就“if”和“while”以及其他布尔上下文而言,这是一个错误的值。 – 2013-05-11 11:46:06

这是因为0本身就是s falsy值。

>>> bool(0) 
False 

>>> bool(1) 
True 

0 and True0因为0是Falsy,AND条件作为停止第一falsy值被发现,并返回该值一旦执行。如果所有值均为True,则返回最右边的值。

OR将继续检查值,直到第一True没有找到否则返回最后一个值(righmtmost)

docs

任何对象都可以对真理值进行测试,使用if或while条件或下面的布尔操作的操作数。下面的值被认为是假:

  • 任何数值类型的零,例如,0, 0L, 0.0, 0j

  • 任何空序列,例如,'',(), []

  • 任何空映射,例如,{}

  • 用户定义类的实例,如果该类定义了__nonzero__()__len__()方法,则该方法返回整数零或布尔值False。

所有其他值被认为是真实的 - 这么多类型的对象总是如此。

除非另有说明,操作和具有布尔结果的内置函数始终返回0或False表示为false,为1或为True。 (重要的例外:布尔操作或和,总是返回其操作数之一)

+0

和'>>>布尔(1)''是TRUE' – 2013-05-11 11:26:21

+0

@GrijeshChauhan啊!是的,还补充说。 – 2013-05-11 11:29:19

+0

Ashwini你也应该加上这个>>> >>> bool('x')是True'和'bool('')是False' – 2013-05-11 11:31:17

的Python总是返回操作数的一个对象

and返回第一个“假”对象或最后的“真实”的对象。

or返回第一个“true”对象或最终的“false”对象。

请注意,所有0,0.0,False,""被视为“false”。

>>> "a" and "b" and "c" 
'c' 
>>> "a" or "b" or "c" 
'a'