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

时间:2013-04-17 20:19:16

标签: 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
  • 有人可以指点我这个功能的文档吗?
  • 是语言的实现细节还是功能?
  • 利用此功能是不是很好的编码风格?

4 个答案:

答案 0 :(得分:26)

orand 短路,请参阅Boolean operations文档:

  

表达式x and y首先评估x;如果x为false,则返回其值;否则,将评估y并返回结果值。

     

表达式x or y首先评估x;如果x为真,则返回其值;否则,将评估y并返回结果值。

请注意,如果and评估为真值,yx 评估}。相反,对于ory仅在x评估为假值时进行评估。

对于第一个表达式True or blah,这意味着永远不会评估blah,因为第一部分已经是True

此外,您的自定义Blah类被视为True:

  

在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false:FalseNone,所有类型的数字零和空字符串和容器(包括字符串,元组,列表,字典,集合和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

  

布尔运算符andor是所谓的短路运算符:它们的参数从左到右进行计算,一旦确定结果,评估就会停止。例如,如果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(因此不再评估值)。