请考虑以下代码:
>>> 0 and True
0
>>> 0 and False
0
为什么我在 Python 中运行上述命令时会0
?
当and
的第一个条件的计算结果为 False
(在 Python 中为 0)时,根本不计算第二个参数,因为and
永远不会变为真。这称为短路。在这种情况下,表达式的结果是第一个操作数,在您的例子中为 0。
因为0
是一个假值(所有数字 0 值都是,以及空容器,以及 None
和 False
)。
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
时永远不会运行