Python - "if"语句中的逻辑评估顺序

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

orand 短路,请参见布尔操作文档:

表达式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)

请注意链接这些并在适用的情况下使用条件表达式.


Pav*_*sov 5

这称为短路,是该语言的一个特征:

http://docs.python.org/2/tutorial/datastructures.html#more-on-conditions

布尔运算符andor所谓的短路运算符:它们的参数从左到右进行计算,一旦确定结果,评估就会停止.例如,如果A和C为真但B为假,则A和B和C不计算表达式C.当用作一般值而不是布尔值时,短路运算符的返回值是最后一个评估论点.