Python:False或None vs. None或False

Vir*_*liu 58 python boolean-logic

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

In [21]: print False or None
-------> print(False or None)
None
Run Code Online (Sandbox Code Playgroud)

这种行为让我很困惑.有人可以向我解释为什么会发生这种情况?我希望他们两个都表现得一样.

Ric*_*dle 81

表达式的x or y计算结果为xif x为true,或者yif x为false.

请注意,上述句子中的"真实"和"假"是在谈论"真实性",而不是固定值TrueFalse.一些"真实"的东西使得一个if声明成功; 一些"虚假"的东西使它失败."假"值包括False,None,0[](空单).

  • @Reloader:仅仅因为两个值是假的并不意味着它们是平等的. (8认同)
  • 大声笑,最近创造的术语[真实性](http://en.wikipedia.org/wiki/Truthiness)的创造性应用,但在这里相当合适,尽管它有可疑的起源. (4认同)
  • @martineau:在这个技术意义上,这是一个更古老的术语.科尔伯特比程序员更有可能将其纳入主流,但他不是唯一的来源. (3认同)
  • 是的,显然是一个*多*较旧的术语.关于词源学的维基词典,他们指出"1824年首次证实".我从未见过使用@RichieHindle所做的技术感 - 尽管在这种情况下它很有意义. (2认同)
  • 如果'"false"值包括False,None,0和[](空列表)',那么为什么`None!= False`评估为'True`? (2认同)

mar*_*eau 11

"或"运算符返回其第一个操作数的,如果该值在Pythonic布尔意义上为真(也称为"真实性"),则返回其第二个操作数的,无论它是什么.见标题为第布尔运算中的部分表达了在目前的在线文档.

在两个示例中,第一个操作数被视为false,因此第二个操作数的值将成为计算表达式的结果.


Boš*_*jak 6

您必须意识到NoneFalse并且True都是单例。

例如,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
Run Code Online (Sandbox Code Playgroud)

实现并注意编码时的重要的事情是比较两件事情,当None需要is,但TrueFalse需求==。避免if foo == None并只做if foo is None,避免if foo != None并只做if foo is not None。在这种情况下if foo is not None,只需做if foo。在这种情况下if foo is None,只需做if not foo

注意:True基本上是1False基本上是0。在Python的旧时代,我们只有1true 0值,而false值。这是更容易理解和人性化地说True,而不是1和更容易理解和人性化的说False不是0

  • 我只是指出,这种“基本相同”可能是微妙错误的来源。假设您有“def fun(foo : str = None): if foo: bar”。现在,当有人传入空字符串时会发生什么?如果空字符串与逻辑中的 None 不同,则可能不是所需的结果。 (2认同)

Nic*_*k T 5

一个密切相关的主题:Python's orand and 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
Run Code Online (Sandbox Code Playgroud)