考虑这段代码:
>>> 0 and True
0
>>> 0 and False
0
为什么在Python中运行上述命令时会得到0
?
答案 0 :(得分:7)
当and
的第一个条件求值为False
(在Python中为0时)时,第二个参数根本不被评估,因为and
将永远不会成立。这称为短路。在这种情况下,表达式的结果是第一个操作数,在您的情况下为0。
答案 1 :(得分:2)
因为0
是一个假值(所有数字0值,以及空容器,None
和False
)。
and
运算符短路;如果左侧表达式的计算结果为false,则返回,否则返回右侧表达式结果。
or
运算符执行相同操作,但是对于真正的左手值; 1 or False
会返回1
。
来自Boolean operations文档:
表达式
x and y
首先评估x
;如果x
为false,则返回其值;否则,将评估y
并返回结果值。表达式
x or y
首先评估x
;如果x
为真,则返回其值;否则,将评估y
并返回结果值。
您可以方便地使用它:
foo = None
if something_or_other:
foo = lambda arg: arg * 3
outcome = foo and foo('bar')
outcome = foo or expensive_call()
其中foo
仅在实际定义时才被调用,而不是None
;仅当expensive_call()
尚未绑定到真值时才会调用foo
。
答案 2 :(得分:0)
你正在与零结盟。你应该总是得到零。
答案 3 :(得分:0)
这是因为逻辑运算符是从左到右进行计算的。因此,对于or
如果为True,则查找未评估的表达式的其余部分:
>>> True or "one"
True
>>> False or "one"
'one'
与and
类似,如果False发现表达式的其余部分被忽略:
>>> True and "one"
'one'
>>> False and "one"
False
在编译器设计中,这个概念称为短路,对于大多数编译器来说这都是相同的设计。
答案 4 :(得分:0)
大多数编程语言具有此功能,它是快速分支检测,在您的情况下and
如果第一个条件为假,评估失败,第二个(其他)条件从不检查
在其他情况下or
如果第一个条件返回true则第二个(其他)条件永远不会检查,结果将为真
这个样本非常酷,例如:
if( list != null and !list.isEmpty() ) {
// do stuff
}
如果此功能不存在,则此if
语句会导致异常,但现在!list.isEmpty()
永远不会在list
为null
时运行