比较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
和notNone
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