奇怪的转换表达式
我注意到的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'
没有被转换; Python布尔逻辑运算符代替短路。
见boolean operators documentation:
表达
x and y
首先评估x
;如果x
为假,则返回其值;否则,将评估y
并返回结果值。表达式
x or y
首先评估x
;如果x
为真,则返回其值;否则,将评估y
并返回结果值。
此外,等于0
的数字被认为是错误的,正如空字符串和容器一样。从相同的文档引用:
在布尔操作的上下文中,以及当表达式通过控制流语句中使用的,下面的值被解释为假:
False
,None
,所有类型的数字零,并且空字符串和容器(包括字符串,元组,列表,字典,集合和frozensets)。
结合这两种行为意味着,对于0 and False
,所述0
是考虑假和评估False
表达之前返回。对于表达式True and 0
,True
进行评估并发现它是一个真实值,因此将返回0
。就if
和while
和其他布尔运算符而言,该结果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
。
但是为什么“True和0”不是False,而是0? – 2013-05-11 11:44:32
@ bzxcv17:同样,短路;第一个表达式('True')是一个真值,因此返回第二个值。 “0”被认为是错误的,所以就“if”和“while”以及其他布尔上下文而言,这是一个错误的值。 – 2013-05-11 11:46:06
这是因为0
本身就是s falsy值。
>>> bool(0)
False
>>> bool(1)
True
0 and True
是0
因为0
是Falsy,AND
条件作为停止第一falsy值被发现,并返回该值一旦执行。如果所有值均为True,则返回最右边的值。
OR
将继续检查值,直到第一True
没有找到否则返回最后一个值(righmtmost)
从docs
:
任何对象都可以对真理值进行测试,使用if或while条件或下面的布尔操作的操作数。下面的值被认为是假:
无
假
任何数值类型的零,例如,
0, 0L, 0.0, 0j
。任何空序列,例如,
'',(), []
。任何空映射,例如,
{}
。用户定义类的实例,如果该类定义了
__nonzero__()
或__len__()
方法,则该方法返回整数零或布尔值False。
所有其他值被认为是真实的 - 这么多类型的对象总是如此。
除非另有说明,操作和具有布尔结果的内置函数始终返回0或False表示为false,为1或为True。 (重要的例外:布尔操作或和,总是返回其操作数之一)
和'>>>布尔(1)''是TRUE' – 2013-05-11 11:26:21
@GrijeshChauhan啊!是的,还补充说。 – 2013-05-11 11:29:19
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'
'>>>布尔( 'X')''是TRUE' – 2013-05-11 11:27:42