【问题标题】:Boolean Python Value confusion布尔 Python 值混淆
【发布时间】:2013-11-04 22:13:26
【问题描述】:

我是 Python 新手,在尝试 Python 逻辑语句时。我遇到了这个我无法理解的问题。谁能告诉我 Python 2.7 中发生了什么。Python 中的 0 和 False 值有什么区别.

>>> 0 或假 错误的 >>> 错误或 0 0

为什么口译员给出不同的答案?

【问题讨论】:

  • 请注意,这两个值都是“假的”;也就是说,它们都在 if 语句中计算为 False

标签: python python-2.7 boolean


【解决方案1】:

您对or 运算符的行为感到困惑;它返回第一个表达式,仅当它是 true 值时; 0False 都不为真,因此返回第二个值:

>>> 0 or 'bar'
'bar'
>>> False or 'foo'
'foo'

任何不是数字 0、空容器、NoneFalse 的值都被认为是 true(自定义类可以通过实现 __bool__ 方法 (python 3)、__nonzero__ (python 2) 来改变它)或__len__(长度0为空)。

如果第一个表达式是True,则甚至不计算第二个表达式:

>>> True or 1 / 0
True

1 / 0 表达式会引发 ZeroDivision 异常,但 Python 甚至不会对其进行评估。

这记录在boolean operators documentation:

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

同理,and 如果是False,则返回第一个表达式,否则返回第二个表达式。

【讨论】:

  • "它返回第一个为真的表达式" Here in 0 或 False 假如何是真?
  • 我不喜欢这个答案,因为“它返回第一个为真的表达式”的理由并不能完全解释这种行为。像“它遍历操作数并返回第一个为 True 的表达式,或遇到的最后一个操作数”之类的东西虽然不太优雅,但可以更好地解释遇到的行为。
  • @WaleedKhan:调整措辞。
【解决方案2】:

这种行为的本质是python的expression evaluation。 Python 评估表达式从左到右,并在lazy manner 中进行。这意味着,那个解释器到达了点,当表达式的值为True时,不管表达式的其余部分,它将遵循与表达式相关联的工作流分支。如果没有一个表达式是True,它将简单地返回最近的(最后一个)。这带来了节省计算资源的好处。考虑以下代码:

>>>False or False or True or range(10**8) 
True
>>>

注意,在这种情况下永远不会调用range(10**8),因此可以节省大量时间。

【讨论】:

    猜你喜欢
    • 2014-01-12
    • 2016-08-14
    • 2011-09-19
    • 1970-01-01
    • 2013-11-28
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    相关资源
    最近更新 更多