【问题标题】:False or None vs. None or False假或无与无或假
【发布时间】:2010-10-12 12:29:54
【问题描述】:
In [20]: print None or False
-------> print(None or False)
False

In [21]: print False or None
-------> print(False or None)
None

这种行为让我很困惑。有人可以向我解释为什么会这样吗?我希望它们的行为相同。

【问题讨论】:

  • Python 中 ["Boolean" 操作的可能重复项(即:and/or 运算符)](stackoverflow.com/questions/3826473/…)
  • @SilentGhost:如果 None 被认为与 False 相同,为什么它返回 None 而不是 False?应用于两个假值的 OR 不应该返回 False 吗?
  • @SilentGhost:我明白了,我不明白,这就是我问的原因。
  • @SilentGhost 这很令人困惑,因为显然,官方文档描述的东西与人们对任何逻辑 OR 运算符的直观预期不同(即操作数的顺序无关)。行为按记录不一定意味着正确行为... ;-)

标签: python boolean-logic


【解决方案1】:

如果x 为真,则表达式x or y 的计算结果为x,如果x 为假,则为y

请注意,上面句子中的“真”和“假”是在谈论“真实性”,而不是固定值TrueFalse。 “真实”的东西使if 语句成功; “错误”的东西使它失败。 “false”值包括FalseNone0[](空列表)。

【讨论】:

  • 哈哈,最近创造的术语truthiness 的创造性应用,但在这里相当合适,尽管它的起源有问题。
  • @martineau:从技术上讲,这是一个更古老的术语。 Colbert 比程序员更有可能将其纳入主流,但他并不是唯一的来源。
  • 是的,显然是一个很多的旧术语。在词源维基词典中,他们指出“1824 年首次证明”。我从未见过@RichieHindle 所做的技术意义上的使用——尽管在这种情况下它非常有意义。
  • 如果'"false" 值包括 False、None、0 和 [](一个空列表)',那么为什么 None != False 的计算结果为 True
  • @Reloader:两个值是假的并不意味着它们相等。
【解决方案2】:

or 运算符返回其第一个操作数的 ,如果该值在 Pythonic 布尔意义上为真(也称为“真实性”),否则返回 值 第二个操作数,不管它是什么。请参阅current online documentation 中关于表达式 部分中标题为Boolean operations 的小节。

在您的两个示例中,第一个操作数被认为是假的,因此第二个操作数的值成为计算表达式的结果。

【讨论】:

    【解决方案3】:

    解释

    你必须意识到TrueFalseNone在Python中都是单例,这意味着存在并且只能存在一个,单例对象的单个实例,因此得名singleton。此外,您不能修改单例对象,因为它的状态是一成不变的,如果我可以使用该短语的话。

    现在,让我解释一下这些 Python 单例是如何使用的。

    让我们有一个名为foo 的Python 对象有一个值None,然后if foo is not None 表示foo 的值不是None。这与if foo 的作用相同,基本上是if foo == True

    所以,not NoneTrue 以及 NoneFalse 的工作方式相同。

    >>> foo = not None
    >>> bool(foo)
    True
    >>> foo = 5  # Giving an arbitrary value here
    >>> bool(foo)
    True
    
    >>> foo = None
    >>> bool(foo)
    False
    >>> foo = 5  # Giving an arbitrary value here
    >>> bool(foo)
    True
    

    编码时要意识到和注意的关键是在比较两个对象时,None 需要is,但TrueFalse 需要==。避免使用if foo == None,只使用if foo is None。另外,避免使用if foo != None,只使用if foo is not None

    警告

    如果您使用if fooif not foofoo 的值恰好是None,请注意代码中的潜在错误。因此,不要以这种方式在条件语句中检查潜在的None 值。如上所述检查它,即if foo is Noneif foo is not None,以确保安全。遵循 Python 专家分享的最佳实践非常重要

    提醒

    True1False0

    在 Python 的旧时代,我们只有整数 1 来表示真值,而整数 0 来表示假值。但是,说True 而不是1 更容易理解和人性化,说False 而不是0 更容易理解和人性化。

    【讨论】:

    • “对于if foo is not None,只需执行if foo”:请注意if foo 与检查None 不同! if 语句首先将其表达式转换为bool,因此如果foo == 0if foo 将失败。
    • None 或 False 或 0 与逻辑相同。编码时只需坚持相同的逻辑。如果你给一个变量的起始值None,坚持在源代码后面用“if foo is None”检查这个值,但这与检查“if not foo”基本相同。这是多功能的,所以使用你认为最好的任何东西。
    • 我只是指出这种“基本相同”可能是细微错误的来源。假设你有def fun(foo : str = None): if foo: bar。现在,当有人传入一个空字符串时会发生什么?如果空字符串与逻辑中的 None 不同,则可能不是所需的结果。
    • 当有人传入一个空字符串时,返回None(因为所有Python函数都隐式返回None)。
    • 我已经修正了我的答案。在执行if fooif not foo 时,我会警告潜在的错误。执行if foo is not Noneif foo is None 表示为Python 的最佳实践。
    【解决方案4】:

    一个密切相关的主题:Python 的 orand short-circuit。在逻辑or 操作中,如果任何参数为真,那么整个事情都是真的,不需要评估其他任何东西; Python 会立即返回那个“真”值。如果它完成并且没有任何内容为真,它会返回它处理的最后一个参数,这将是一个“假”值。

    and 则相反,如果它看到任何假值,它会立即以那个“假”值退出,或者如果它全部通过,则返回最终的“真”值。

    >>> 1 or 2 # first value TRUE, second value doesn't matter
    1
    >>> 1 and 2 # first value TRUE, second value might matter
    2
    >>> 0 or 0.0 # first value FALSE, second value might matter
    0.0
    >>> 0 and 0.0 # first value FALSE, second value doesn't matter
    0
    

    【讨论】:

    • 严格来说,Python不会短路'or'和'and'操作,因为它不会被强制计算为True或False,而是返回参数,以便用户可以应用对象的真实性。从这个意义上说,RichieHindie 的答案非常明确:for or,如果其值为 true,则返回第一个参数,否则返回第二个;对于并且,它是转换,如果第一个计算结果为真,则返回第二个,否则返回第一个。
    【解决方案5】:

    从布尔值的角度来看,它们的行为相同,都返回一个计算结果为 false 的值。

    or 只是“重用”它给出的值,如果为真则返回左边的值,否则返回右边的值。

    【讨论】:

      【解决方案6】:
      Condition1 or Condition2
      

      如果 Condition1 为 False,则计算并返回 Condition2。 无评估为 False。

      【讨论】:

        猜你喜欢
        • 2012-09-23
        • 2014-02-17
        • 2015-12-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 2019-01-30
        • 2014-10-18
        • 2014-09-07
        相关资源
        最近更新 更多