将 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
。
考虑这两个事实:
None
为假
and
returns 如果两个变量都为真,则为真。
在每一个误导你的案例中,你都没有考虑这些事实。
所有 Python 内置函数和大多数实例都具有隐式真值,这要归功于它们的 __bool__
magic methods。在您的例子中,您使用的是 int
和 None
的内置类型。在纯 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
...
每当完成需要将变量视为布尔值的操作(and
、or
、not
、bool
转换)时,这些 __bool__
魔术方法用于获取其对应实例的真值。
所以考虑到这一点,让我们一个一个地看你的表情。
>>> bool(a and b)
False
a
是整数 7
,因此通过其 __bool__
魔术方法,它具有正真值 (True
)。 b
是 None
,它的真值为负 (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
,因此您不是在比较真值,而是在检查它们是否是同一个对象。由于 7
和 None
不是同一个实例,因此结果为 False
,导致语句的其余部分计算为 False
。
>>> bool((a and b) is None) # (a and b) eq False (should be None)
True
从第一个开始,a and b
将 return None
。由于 None
与 None
是同一个实例,因此 None is None
的计算结果为 True
。强制转换为 bool
是多余的。
>>> bool(False is None)
False
最后,我们再次检查 False
和 None
是否是同一个实例。因为它们不是,所以计算结果为 False
并且转换为 bool
再次是多余的。
有没有人可以告诉我为什么我得到这种 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
。
考虑这两个事实:
None
为假and
returns 如果两个变量都为真,则为真。
在每一个误导你的案例中,你都没有考虑这些事实。
所有 Python 内置函数和大多数实例都具有隐式真值,这要归功于它们的 __bool__
magic methods。在您的例子中,您使用的是 int
和 None
的内置类型。在纯 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
...
每当完成需要将变量视为布尔值的操作(and
、or
、not
、bool
转换)时,这些 __bool__
魔术方法用于获取其对应实例的真值。
所以考虑到这一点,让我们一个一个地看你的表情。
>>> bool(a and b)
False
a
是整数 7
,因此通过其 __bool__
魔术方法,它具有正真值 (True
)。 b
是 None
,它的真值为负 (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
,因此您不是在比较真值,而是在检查它们是否是同一个对象。由于 7
和 None
不是同一个实例,因此结果为 False
,导致语句的其余部分计算为 False
。
>>> bool((a and b) is None) # (a and b) eq False (should be None)
True
从第一个开始,a and b
将 return None
。由于 None
与 None
是同一个实例,因此 None is None
的计算结果为 True
。强制转换为 bool
是多余的。
>>> bool(False is None)
False
最后,我们再次检查 False
和 None
是否是同一个实例。因为它们不是,所以计算结果为 False
并且转换为 bool
再次是多余的。