将 None 与 Python3 中的几个变量进行比较

Comparing None to several variables in Python3

有没有人可以告诉我为什么我得到这种 return 值?

>>> a = 7
>>> b = None
>>> bool(a and b)
False
>>> bool((a is None) and (b is None))
False
>>> bool((a and b) is None) # (a and b) eq False
True
>>> bool(False is None)
False

我只是不明白为什么会这样。

解释一下

>>> 7 and None
None
>>> bool(None)
False

所以要回答:

  • a and b 给出了 None 没有 False 正如你在评论中所说的那样。
  • bool(a and b) 给出 False

那么当您将 a and b 替换为其实际值时:

  • 你得到 bool(None is None)True

我相信你已经想到了 bool(bool(a and b) is None),这会给 False

Python 的 and 实际上是 return 测试的最后一个值。对于x and y,如果x为假,则return x;如果 x 为真,它将 return y。例如:

>>> 0 and ''
0
>>> 0 and 'x'
0
>>> 1 and ''
''
>>> 1 and 'x'
'x'

所以当您执行 a and b 时,您会得到 None

来源:Documentation: Boolean Operations — and, or, not

考虑这两个事实:

  1. None 为假
  2. and returns 如果两个变量都为真,则为真。

在每一个误导你的案例中,你都没有考虑这些事实。

所有 Python 内置函数和大多数实例都具有隐式真值,这要归功于它们的 __bool__ magic methods。在您的例子中,您使用的是 intNone 的内置类型。在纯 python 中,int__bool__ 方法会像下面这样:

class int(object):
...
    def __bool__(self):
        return self != 0 # True as long as not equal to 0
...

对于 None 它将是以下内容:

class NoneType(object):
    ...
    def __bool__(self):
        return False # Always False
    ...

每当完成需要将变量视为布尔值的操作(andornotbool 转换)时,这些 __bool__ 魔术方法用于获取其对应实例的真值。

所以考虑到这一点,让我们一个一个地看你的表情。

>>> bool(a and b)
False

a 是整数 7,因此通过其 __bool__ 魔术方法,它具有正真值 (True)。 bNone,它的真值为负 (False)。当您 Python 中的 and 变量时,如果第一个 and 操作数具有正真值, and 将始终 return 第二个操作数(相反的行为可以用 or 可以看到)。有关这方面的更多信息,请参见 here。因此,当您执行 a and b 时,None 被 return 编辑,因为 a 具有正的真值。然后将生成的 None 转换为 bool,如上面 None__bool__ 方法所示,将是 False.

>>> bool((a is None) and (b is None))
False

计算结果为 False,因为 a 不是 None。在这里,由于您在语句中使用 is,因此您不是在比较真值,而是在检查它们是否是同一个对象。由于 7None 不是同一个实例,因此结果为 False,导致语句的其余部分计算为 False

>>> bool((a and b) is None) # (a and b) eq False (should be None)
True

从第一个开始,a and b 将 return None。由于 NoneNone 是同一个实例,因此 None is None 的计算结果为 True。强制转换为 bool 是多余的。

>>> bool(False is None)
False

最后,我们再次检查 FalseNone 是否是同一个实例。因为它们不是,所以计算结果为 False 并且转换为 bool 再次是多余的。