【问题标题】:Python - logical evaluation order in "if" statementPython - “if”语句中的逻辑评估顺序
【发布时间】:2013-04-10 18:35:45
【问题描述】:

在 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
  • 谁能指点我有关此功能的文档?
  • 是语言的实现细节还是特性?
  • 利用此功能是一种好的编码风格吗?

【问题讨论】:

  • blah or True 不会为我引发异常,它会打印出来。
  • @TimS.:仅当您定义 blahfirst 时。请注意,示例顶部的blah尚未定义,因此会引发NameError

标签: python boolean short-circuiting


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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】:

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

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

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

      请注意,对于andyx 评估为 True 值时评估。相反,对于or,只有在x 评估为False 值时才会评估y

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

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

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

      【讨论】:

        【解决方案4】:

        使用or 运算符,从左到右计算值。在一个值计算为 True 后,整个语句的计算结果为 True(因此不再计算任何值)。

        【讨论】:

          猜你喜欢
          • 2019-02-06
          • 1970-01-01
          • 1970-01-01
          • 2021-03-05
          • 1970-01-01
          • 1970-01-01
          • 2014-06-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多