在Python中我们可以这样做:
if True or blah:
print("it's ok") # will be executed
if blah or True: # will raise a NameError
print("it's not ok")
class Blah:
pass
blah = Blah()
if blah or blah.notexist:
print("it's ok") # also will be executed
答案 0 :(得分:26)
or
和and
短路,请参阅Boolean operations文档:
表达式
x and y
首先评估x
;如果x
为false,则返回其值;否则,将评估y
并返回结果值。表达式
x or y
首先评估x
;如果x
为真,则返回其值;否则,将评估y
并返回结果值。
请注意,如果and
评估为真值,y
,x
仅评估1>}。相反,对于or
,y
仅在x
评估为假值时进行评估。
对于第一个表达式True or blah
,这意味着永远不会评估blah
,因为第一部分已经是True
。
此外,您的自定义Blah
类被视为True:
在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false:
False
,None
,所有类型的数字零和空字符串和容器(包括字符串,元组,列表,字典,集合和frozensets)。所有其他值都被解释为true。 (有关更改此方法的方法,请参阅__nonzero__()
特殊方法。)
由于您的类没有实现__nonzero__()
方法(也不是__len__
方法),因此就布尔表达式而言,它被视为True
。
在表达式blah or blah.notexist
中,blah
因此为真,blah.notexist
永远不会被评估。
经验丰富的开发人员经常有效地使用此功能,通常用于指定默认值:
some_setting = user_supplied_value or 'default literal'
object_test = is_it_defined and is_it_defined.some_attribute
请注意链接这些内容,并在适用的情况下使用conditional expression。
答案 1 :(得分:5)
这称为短路,是该语言的一个特征:
http://docs.python.org/2/tutorial/datastructures.html#more-on-conditions
布尔运算符
and
和or
是所谓的短路运算符:它们的参数从左到右进行计算,一旦确定结果,评估就会停止。例如,如果A和C为真但B为假,则A和B和C不计算表达式C.当用作一般值而不是布尔值时,短路运算符的返回值是最后一个评估论证。
答案 2 :(得分:2)
这是运算符逻辑运算符的方式,特别是python中的or
:短路评估。
为了更好地解释它,请考虑以下事项:
if True or False:
print('True') # never reaches the evaluation of False, because it sees True first.
if False or True:
print('True') # print's True, but it reaches the evaluation of True after False has been evaluated.
有关详细信息,请参阅以下内容:
答案 3 :(得分:1)
使用or
运算符,值从左到右进行计算。在一个值计算为True
之后,整个语句的计算结果为True
(因此不再评估值)。