In [20]: print None or False
-------> print(None or False)
False
In [21]: print False or None
-------> print(False or None)
None
这种行为让我很困惑。有人可以向我解释为什么会这样吗?我希望他们都表现得一样。
In [20]: print None or False
-------> print(None or False)
False
In [21]: print False or None
-------> print(False or None)
None
这种行为让我很困惑。有人可以向我解释为什么会这样吗?我希望他们都表现得一样。
该表达式的x or y
计算结果为x
ifx
为 true,或者y
ifx
为 false。
请注意,上面句子中的“真”和“假”是在谈论“真实性”,而不是固定值True
和False
。“真实”的东西使if
陈述成功;“错误”的东西使它失败。“假”值包括False
、None
和0
([]
一个空列表)。
or
运算符返回其第一个操作数的值,如果该值在 Pythonic 布尔意义上为真(也称为“真实性”),否则它返回其第二个操作数的值,无论它碰巧是什么。请参阅当前在线文档中表达式部分中标题为布尔运算的小节。
在您的两个示例中,第一个操作数被认为是错误的,因此第二个操作数的值成为评估表达式的结果。
你必须意识到True
, False
, 和None
都是 Python 中的单例,这意味着存在并且只能存在一个, 单例对象的单个实例,因此得名单例。此外,如果我可以使用该短语,您不能修改单例对象,因为它的状态是一成不变的。
现在,让我解释一下如何使用这些 Python 单例。
让我们有一个名为的 Python 对象foo
,它有一个值None
,然后if foo is not None
说它foo
的值不是None
. 这和说的一样if foo
,基本上是if foo == True
。
因此,not None
和True
以同样的方式工作,以及None
和False
。
>>> 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
,但是True
和False
需要==
。避免使用if foo == None
,只使用if foo is None
。另外,避免使用if foo != None
并且只使用if foo is not None
.
如果您正在使用if foo
或if not foo
当 的值foo
恰好是 时None
,请注意代码中的潜在错误。因此,不要以None
这种方式检查条件语句中的潜在值。如上所述,通过检查它来确保安全,即,if foo is None
或if foo is not None
。遵循 Python 专家分享的最佳实践非常重要。
True
是一个1
并且False
是一个0
。
在 Python 的旧时代,我们只有整数1
来表示真值,而整数0
来表示假值。但是,说而不是更容易理解和人性化,而说True
而不是1
更容易理解和人性False
化0
。
一个密切相关的主题:Pythonor
和and
短路。在逻辑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
从布尔值的角度来看,它们的行为相同,都返回一个值为 false 的值。
or
只是“重用”它给出的值,如果为真则返回左边的值,否则返回右边的值。
Condition1 or Condition2
如果 Condition1 为 False,则评估并返回 Condition2。无评估为 False。