[英]Comparing None to several variables in Python3
有没有人可以告诉我为什么我得到这种类型的返回值?
>>> 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's and
实际上返回测试的最后一个值。 对于x and y
,如果x
为假,则返回x
; 如果x
为真,它将返回y
。 例如:
>>> 0 and ''
0
>>> 0 and 'x'
0
>>> 1 and ''
''
>>> 1 and 'x'
'x'
所以当你做a and b
,你会得到None
。
来源: 文档:布尔运算——和、或、非
考虑以下两个事实:
None
是假的and
返回真。在每一个误导你的案例中,你都没有考虑这些事实。
由于其__bool__
魔术方法,所有 Python 内置函数和大多数实例都具有隐含的真值。 在您的情况下,您正在使用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
总是返回第二个操作数(相反的行为可以用or
看到)。 可以在此处找到有关这方面的更多信息。 因此,当您执行a and b
,将返回None
因为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
将返回None
。 因为None
是同一个实例None
, None is None
的计算结果为True
。 强制转换为bool
是多余的。
>>> bool(False is None)
False
最后,在这里我们再次检查False
和None
是否是同一个实例。 由于它们不是,因此计算结果为False
并且转换为bool
再次是多余的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.