比较Python3中的None和几个变量

比较Python3中的None和几个变量,python,types,nonetype,Python,Types,Nonetype,有没有人能告诉我为什么会得到这种类型的返回值 >>> 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) Fals

有没有人能告诉我为什么会得到这种类型的返回值

>>> 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和无
没有一个
>>>布尔(无)
错误的
因此,我要回答:

  • a和b
    在注释中给出
    None
    not
    False
  • bool(a和b)
    给出
    False
因此,当您将
a和b
替换为其实际值时:

  • 您将得到
    bool(无即无)
    这是
    True

我相信您已经记住了
bool(bool(a和b)是None)
,这将给出
False
Python的
实际返回最后测试的值。对于
x和y
,如果
x
为false,它将返回
x
;如果
x
为真,它将返回
y
。例如:

>>> 0 and ''
0
>>> 0 and 'x'
0
>>> 1 and ''
''
>>> 1 and 'x'
'x'
因此,当您执行
a和b
时,您将得到
None


来源:

考虑以下两个事实:

  • None
    为false
  • 如果两个变量都为true,则返回true

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

    < P>所有Python构建和大多数实例都有隐含的真值。在本例中,您使用的是内置类型的
    int
    None
    。在纯python中,用于
    int
    \uuuu bool\uuu
    方法如下所示:

    class int(object):
    ...
        def __bool__(self):
            return self != 0 # True as long as not equal to 0
    ...
    
    class NoneType(object):
        ...
        def __bool__(self):
            return False # Always False
        ...
    
    对于
    None
    ,它将如下所示:

    class int(object):
    ...
        def __bool__(self):
            return self != 0 # True as long as not equal to 0
    ...
    
    class NoneType(object):
        ...
        def __bool__(self):
            return False # Always False
        ...
    
    每当执行一个要求将变量视为布尔值的操作时(
    布尔
    转换),这些
    \uuuuuuuuuuuuuuuuuu>魔术方法用于获取相应实例的真值

    记住这一点,让我们一个接一个地看看你的表情

    >>> bool(a and b)
    False
    
    a
    是整数
    7
    ,因此通过它的
    \uuuubool\uuuuuu
    魔术方法,它有一个正真值(
    True
    b
    None
    ,且其真值为负值(
    False
    )。在Python中使用
    变量时,如果第一个
    操作数具有正真值,
    将始终返回第二个操作数(使用
    可以看到相反的行为)。有关这方面的更多信息,请参见。因此,当执行
    a和b
    时,将返回
    None
    ,因为
    a
    具有正真值。然后将生成的
    None
    强制转换为
    bool
    ,如上面
    None
    \uuuuubool\uu
    方法所示,该方法将为
    False

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

    >>> bool((a and b) is None) # (a and b) eq False (should be None)
    True
    
    从第一个开始后续,
    a和b
    将返回
    None
    。由于
    None
    是与
    None
    相同的实例,
    None是None
    的计算结果为
    True
    。对
    bool
    的转换是多余的

    >>> bool(False is None)
    False
    

    最后,我们再次检查
    False
    None
    是否为同一实例。由于它们不是,因此计算结果为
    False
    ,而对
    bool
    的强制转换再次是多余的。

    欢迎使用堆栈溢出!查看。
    a和b
    解析为
    a
    如果为false-y,则为
    b
    <代码>(a和b)是无的
    a是无的,b是无的
    不同。有任何答案解决了您的问题吗?如果是这样的话,你介意接受那一个吗。这不仅可以让您回馈回答您问题的人,让他们花时间回答您的问题,而且还可以通过向用户展示您所面临问题的正确解决方案来改善SO社区。对于面临相同问题的其他用户来说,这可能是一笔巨大的财富。如果没有一个答案解决了你的问题,你能为最接近的答案添加详细信息,以便对其进行调整以完全回答吗?你所说的返回最后一个测试值是什么意思?@Alexander I澄清只是为了澄清,
    none
    不是假,
    none
    的真值是
    false
    。我之所以纠正这一点,是因为如果以“pythonically”(在这种情况下,
    None为False
    的计算结果为
    False
    )的话,它可能看起来不清楚。另外,
    如果具有负真值,则返回第一个操作数,否则返回第二个操作数。所以
    0和1
    将返回
    0
    ,但是
    1和2
    将返回
    2
    >>> bool(False is None)
    False