Python逻辑表达式中的奇怪转换

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'

Mar*_*ers 7

什么都没有被改变; 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返回.至于ifwhile等布尔运算符而言,这一结果,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).

  • @ bzxcv17:再次,短路; 第一个表达式("True")是一个真值,因此返回第二个值.`0`被认为是假的,因此就`if`和`while`以及其他布尔上下文而言,这是一个假值. (2认同)