【发布时间】:2014-04-01 18:03:41
【问题描述】:
考虑这段代码:
>>> 0 and True
0
>>> 0 and False
0
为什么我在 Python 中运行上述命令时得到0?
【问题讨论】:
-
这叫短路。
考虑这段代码:
>>> 0 and True
0
>>> 0 and False
0
为什么我在 Python 中运行上述命令时得到0?
【问题讨论】:
当and 的第一个条件计算为False(在Python 中为0)时,第二个参数根本不计算,因为and 永远不会变为真。这称为短路。在这种情况下,表达式的结果是第一个操作数,在您的情况下为 0。
【讨论】:
因为0 是一个假值(所有数字0 值,以及空容器,以及None 和False)。
and 操作员短课程;如果左侧表达式的计算结果为假值,则返回,否则返回右侧表达式结果。
or 运算符的作用相同,但用于真正的左值; 1 or False 返回1。
来自Boolean operations 文档:
表达式
x and y首先计算x;如果x为假,则返回其值;否则,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 尚未绑定到真值时才被调用。
【讨论】:
您正在与零进行与运算。你应该总是得到零。
【讨论】:
& 是这样,但答案是布尔型and 更复杂(并且特定于Python)。
这是因为,逻辑运算符是从左到右计算的。因此,对于 or,如果为 True,则找到未计算的表达式的其余部分:
>>> True or "one"
True
>>> False or "one"
'one'
and 也类似,如果 False 发现表达式的其余部分被忽略:
>>> True and "one"
'one'
>>> False and "one"
False
在编译器设计中,这个概念被称为短路,大多数编译器的设计都是一样的。
【讨论】:
大多数编程语言都具有此功能,它是快速分支检测,在您的情况下and 如果第一个条件为假,则评估失败并且第二个(其他)条件从不检查
在其他情况下or 如果第一个条件返回 true 第二个(其他)条件从不检查并且结果将为 true
这是一个非常酷的功能,例如看这个示例:
if( list != null and !list.isEmpty() ) {
// do stuff
}
如果这个特性不存在,这个if语句会导致异常,但是现在list是null时!list.isEmpty()永远不会运行
【讨论】:
true 或 false,而不是真值(因为 Java 没有这样的概念)。