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

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

这种行为让我很困惑。有人可以向我解释为什么会这样吗?我希望他们都表现得一样。

4

6 回答 6

111

该表达式的x or y计算结果为xifx为 true,或者yifx为 false。

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

于 2010-10-12T12:31:47.820 回答
16

or运算符返回其第一个操作数的值如果该值在 Pythonic 布尔意义上为真(也称为“真实性”),否则它返回其第二个操作数的无论它碰巧是什么请参阅当前在线文档中表达式部分中标题为布尔运算的小节。

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

于 2010-10-12T13:16:08.353 回答
11

解释

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

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

让我们有一个名为的 Python 对象foo,它有一个值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 foo当 的值foo恰好是 时None,请注意代码中的潜在错误。因此,不要以None这种方式检查条件语句中的潜在值。如上所述,通过检查它来确保安全,即,if foo is Noneif foo is not None。遵循 Python 专家分享的最佳实践非常重要。

提醒

True是一个1并且False是一个0

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

于 2017-11-18T13:21:06.260 回答
5

一个密切相关的主题:Pythonorand 短路。在逻辑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
于 2010-10-12T13:57:37.193 回答
2

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

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

于 2010-10-12T12:33:07.007 回答
1
Condition1 or Condition2

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

于 2010-10-12T12:33:49.720 回答