为什么我在运行 "0 and True" 或 "0 and False" 时得到 0



请考虑以下代码:

>>> 0 and True
0
>>> 0 and False
0

为什么我在 Python 中运行上述命令时会0

and的第一个条件的计算结果为 False(在 Python 中为 0)时,根本不计算第二个参数,因为and永远不会变为真。这称为短路。在这种情况下,表达式的结果是第一个操作数,在您的例子中为 0。

因为0是一个假值(所有数字 0 值都是,以及空容器,以及 NoneFalse )。

and运算符 short curcuits;如果左侧表达式的计算结果为 false 值,则返回该表达式,否则返回右侧表达式结果。

or运算符执行相同的操作,但对于真正的左侧值; 1 or False返回1 .

来自布尔操作文档:

表达式x and y首先计算x;如果x为 false,则返回其值;否则,计算y并返回结果值。

表达式x or y首先计算x;如果x为 true,则返回其值;否则,计算y并返回结果值。

您可以方便地使用它:

foo = None
if something_or_other:
    foo = lambda arg: arg * 3
outcome = foo and foo('bar')
outcome = foo or expensive_call()

其中foo只有在实际定义且尚未None时才被调用;仅当foo尚未绑定到真值时才调用expensive_call()

你用零来做。你应该总是得到零。

这是因为逻辑运算符是从左到右计算的。因此,对于or如果 True 查找表达式的其余部分未计算:

>>> True or "one"
True
>>> False or "one"
'one'

同样,对于and,如果 False 发现表达式的其余部分被忽略:

>>> True and "one"
'one'
>>> False and "one"
False
在编译器设计

中,这个概念称为短路,对于大多数编译器来说,这是相同的设计。

大多数

编程语言都有此功能,它是快速分支检测,在您的情况下and如果第一个条件为假,评估失败,第二个(其他)条件从不检查
在其他情况下or如果第一个条件返回 true,则第二个(其他)条件从不检查,结果将为真
这是非常酷的功能,例如,看看这个例子:

if( list != null and !list.isEmpty() ) {
    // do stuff
}

如果此功能不存在,则此if语句会导致异常,但现在!list.isEmpty()list null时永远不会运行

最新更新