Gil*_*tes 9 python boolean short-circuiting
在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
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 28
在or和and 短路,请参见布尔操作文档:
表达式
x and y首先评估x; 如果x为false,则返回其值; 否则,y将评估并返回结果值.表达式
x or y首先评估x; 如果x为真,则返回其值; 否则,y将评估并返回结果值.
注意如何,对and,y是只有当评估x计算为一个真正的价值.相反,对or,y只有当评估x评估为False值.
对于第一个表达式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
Run Code Online (Sandbox Code Playgroud)
这称为短路,是该语言的一个特征:
http://docs.python.org/2/tutorial/datastructures.html#more-on-conditions
布尔运算符
and和or所谓的短路运算符:它们的参数从左到右进行计算,一旦确定结果,评估就会停止.例如,如果A和C为真但B为假,则A和B和C不计算表达式C.当用作一般值而不是布尔值时,短路运算符的返回值是最后一个评估论点.