【问题标题】:How to understand the result of `None or False`, `False or None`, `None and False`, `False and None` in Python?如何理解 Python 中“None or False”、“False or None”、“None and False”、“False and None”的结果?
【发布时间】:2017-12-19 02:34:17
【问题描述】:

我以为我理解了 Python 中的这两个单例值,直到我看到有人在代码中使用return l1 or l2,其中 l1 和 l2 都是链表对象,并且(s)如果不是 None,他想返回 l1,否则,返回 l2。

这段代码很好,因为它很短而且看起来很容易理解。然后,我写了一些代码来弄清楚这里发生了什么。

print ( True or 'arbitrary' ) #True
print ( False or 'arbitrary') #arbitrary
print ( None or 'arbitrary' ) #arbitrary

打印结果符合预期。但是,当我尝试将 NoneFalse 放在一起时。发生了一件非常奇怪的事情。

print ( False or None ) #None
print ( None or False ) #False
print ( None or False or True) #True

所以,我猜return A or B 的规则是:

  • 按顺序返回第一个 True(非 None,Not False)值(先 A,后 B)

  • 如果没有True值,则返回最后一个值。

最后,我运行这段代码来验证我的猜测。

print ( None or False or True or None) # True
print ( None or False or None) # None
print ( False or None or False) # False

结果似乎证明了我的理论。但是谁有更多的解释?

另外,当我使用and 时,我得到了一些有趣的东西。为什么?

print ( None and False) #None
print ( False and None) #False

【问题讨论】:

标签: python logic


【解决方案1】:

简短的回答是'and'返回第一个假值或最后一个真值,'or'返回第一个真或最后一个假的答案。

>>> None or False
False
>>> False or None
>>> False and None
False
>>> None and False

...

>>> 0 or 3 or 4
3
>>> 5 and 0 and 6
0
>>> 5 and 0 or 6
6
>>> False or {} or 0
0
>>> 3 and 4 and 5
5

【讨论】:

    【解决方案2】:

    在python中,空字符串、集合、列表、字典、其他容器或0都等价于逻辑运算的False。非空集合和非零数字在逻辑上为真。

    对于“或”,如果之前没有遇到逻辑上的 True 表达式,则将返回最后一个表达式。该表达式将按上述规则进行逻辑评估。

    【讨论】:

      【解决方案3】:

      无需猜测。对于or,Python 的Reference Manual 表示

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

      换句话说,x if x else y,其中x 仅被评估一次,y 仅在需要时被评估。

      对于and,将“真”更改为“假”。

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

      换句话说,x if not x else y,其中x 只评估一次,y 仅在需要时评估。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多