Bar*_*ach 6 python evaluation boolean-logic python-2.7
我注意到Python 2.7逻辑表达式的奇怪行为:
>>> 0 and False 0 >>> False and 0 False >>> 1 and False False >>> False and 1 False
并用True代替False
>>> 0 and True 0 >>> True and 0 0 >>> 1 and True True >>> True and 1 1
Python将逻辑语句转换为整数时是否有任何规则?为什么有时会显示0为假,1为真?
更重要的是,为什么会归还这个?
>>>"test" or "test" 'test'
什么都没有被改变; Python布尔逻辑运算符而不是短路.
请参阅布尔运算符文档:
表达式
x and y
首先评估x
; 如果x
为false,则返回其值; 否则,y
将评估并返回结果值.表达式
x or y
首先评估x
; 如果x
为真,则返回其值; 否则,y
将评估并返回结果值.
此外,等于的数字0
被认为是假的,空字符串和容器也是如此.引自同一文件:
在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false :
False
,None
所有类型的数字零,以及空字符串和容器(包括字符串,元组,列表,字典,集合)和frozensets).
将这两种行为结合起来意味着,在评估表达式之前0 and False
,将0
其视为 false并返回False
.对于表达式True and 0
,True
进行求值并发现它是一个真值,因此0
返回.至于if
和while
等布尔运算符而言,这一结果,0
被认为是假的为好.
您可以使用它来提供默认值,例如:
foo = bar or 'default'
Run Code Online (Sandbox Code Playgroud)
要将非布尔值真正转换为布尔值,请使用bool()
类型 ; 它使用与布尔表达式相同的规则来确定输入的布尔值:
>>> bool(0)
False
>>> bool(0.0)
False
>>> bool([])
False
>>> bool(True and 0)
False
>>> bool(1)
True
Run Code Online (Sandbox Code Playgroud)
要完成图片,布尔上下文中不被视为false的值将被视为true,包括任何自定义类.您可以通过在类上实现.__nonzero__()
特殊方法来更改它.如果没有定义这样的方法,.__len__()
也请参考.使用这些方法中的任何一种,您都可以发信号通知您的类型是数字,True
如果非零,则应该考虑它,或者它是一个容器,True
如果不是空的话,应该考虑它(长度超过0).