繁体   English   中英

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

[英]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

来源: 文档:布尔运算——和、或、非

考虑以下两个事实:

  1. None是假的
  2. 如果两个变量都为真and返回真。

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

由于其__bool__魔术方法,所有 Python 内置函数和大多数实例都具有隐含的真值。 在您的情况下,您正在使用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总是返回第二个操作数(相反的行为可以用or看到)。 可以在此处找到有关这方面的更多信息。 因此,当您执行a and b ,将返回None因为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将返回None 因为None是同一个实例NoneNone is None的计算结果为True 强制转换为bool是多余的。

>>> bool(False is None)
False

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM