【问题标题】:Python: and/or operators strange behaviorPython:和/或运算符奇怪的行为
【发布时间】:2013-12-27 09:32:58
【问题描述】:

我知道 AND 运算符优先于 OR 运算符。我也相信,就像在 C/CPP 中一样,这些运算符的关联性是从左到右的(尽管它似乎对我的问题并不重要)。

我在 Python 2.7.1 中运行以下代码:

案例一:

我有三个功能:

def f(): print 3; return True

def g(): print 4; return False

def h(): print 5; return False

当我运行以下命令时

f() and g() or h()

我明白了

3
4
5
False

这很好(我所期望的)。

案例 2:

如果我将函数更改为:

def f(): print 3

def g(): print 4

def h(): print 5

我得到相同的命令:

3
5

案例 3:

如果我将命令更改为

 f() and (g() or h())

我只得到:

 3

我知道在最后两个示例中,函数实际上并没有返回布尔值,但是 - 我不理解这种行为。似乎不一致:

我们将函数 f(),h(),g() 称为 True 还是 False 或其他什么(什么?)?

为什么在第二种情况下运行的是 h() 而不是 g()?

为什么在最后一种情况下它们(g 和 h)都没有运行?

【问题讨论】:

    标签: python operators operator-precedence


    【解决方案1】:

    在 Python 中,不显式返回任何内容的函数会返回 NoneNone 在布尔上下文中被认为是假的。

    在第二个示例中,g 未运行,因为 and 运算符 short-circuitsf 的结果是假的,所以 g() 不需要计算,因为它的结果不会改变整个 and 表达式的结果。

    同样,在第三个示例中,由于 f() 为 false,因此不需要评估 and 的右侧,因此 gh 不要运行。

    【讨论】:

    • 第二种情况如何解释?
    • @GariBN:添加了短路评估说明。
    • 好的。似乎虽然我知道短路并写了运算符的优先级,但我不知何故首先评估了 OR 运算符,因此无法理解为什么不评估 h() 函数。谢谢!
    • 运算符优先规则已记录在案。 or 优先于 and
    【解决方案2】:

    这里,由于所有函数都返回 None,当你说 f() and g() or h() 时,函数 g() 永远不会被评估。那是因为and 的第一个操作数是False。但是 h() 被求值是因为 or 的第一个操作数是 False

    注意:f() and g() or h()(f() and g()) or h() 相同

    http://docs.python.org/2/reference/expressions.html#boolean-operations

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 2020-01-20
      • 2012-05-03
      • 2013-10-29
      • 2015-02-01
      相关资源
      最近更新 更多