Python 为什么(非None)=True的计算结果为True?

Python 为什么(非None)=True的计算结果为True?,python,python-2.7,Python,Python 2.7,这让我最近在一段Python代码中大吃一惊——我正在检查列表中的任何值是否为False,因此我使用了如下方法: if any(not v for v in values): # Do something... 但是,我忘了列表中有None值,所以我一直得到令人困惑的输出,直到我记得先检查它。这让我想知道,(而不是None)=True背后的基本原理是什么None==False的计算结果为False,因此它不是自反的,我也不清楚None对象的逻辑否定为什么应该计算为True为什么会发生这种

这让我最近在一段Python代码中大吃一惊——我正在检查列表中的任何值是否为False,因此我使用了如下方法:

if any(not v for v in values):
    # Do something...

但是,我忘了列表中有
None
值,所以我一直得到令人困惑的输出,直到我记得先检查它。这让我想知道,
(而不是None)=True
背后的基本原理是什么
None==False
的计算结果为
False
,因此它不是自反的,我也不清楚
None
对象的逻辑否定为什么应该计算为
True

为什么会发生这种情况的解释在对您的问题的注释中。检查列表中的任何内容是否计算为false的一个好方法是:

if not all(values):

有很多方法可以做你正在做的事情,但对我来说,这比你对列表的理解更具可读性。

关于为什么会发生这种情况的解释是在对你的问题的评论中。检查列表中的任何内容是否计算为false的一个好方法是:

if not all(values):

有很多方法可以做你正在做的事情,但对我来说,这比你对列表的理解更具可读性。

这个相关问题的答案包含了一些你可能想查看的好信息,解释了Python中使用
True
False
None
的细节:

在比尔·卢巴诺维奇(Bill Lubanovic)的《介绍Python》一书中可以找到一个更具体的解释,该书提到了使用“真实性”和“错误性”概念检查空数据结构以及
False
条件的Python程序。作者甚至在第88页上有一个标题为“无有用”的小节,其中详细阐述了:

None
是一个特殊的Python值,它在没有什么可说的情况下占据一席之地。 它与布尔值
False
不同,尽管当作为布尔值计算时,它看起来是False。 [...] 您需要
None
来区分缺少的值和空值。。。零值整数或浮点数、空字符串(“”)、列表([])、元组(,)、字典({})和集合(集合())都是
False
,但不等于
None

这就是为什么
None
的行为方式与
True
False
1
0
不同的基本原理


至于你问题的另一部分,它似乎是一个逻辑重言:
None
False
,因为基于上述原因,Python将
None
解释为与
null
等价。通过将
not
添加到
None
中,可以反转其布尔值,从而将其转换为
True

对相关问题的回答包含一些您可能想查看的好信息,解释了Python中使用
True
False
None
的详细信息:

在比尔·卢巴诺维奇(Bill Lubanovic)的《介绍Python》一书中可以找到一个更具体的解释,该书提到了使用“真实性”和“错误性”概念检查空数据结构以及
False
条件的Python程序。作者甚至在第88页上有一个标题为“无有用”的小节,其中详细阐述了:

None
是一个特殊的Python值,它在没有什么可说的情况下占据一席之地。 它与布尔值
False
不同,尽管当作为布尔值计算时,它看起来是False。 [...] 您需要
None
来区分缺少的值和空值。。。零值整数或浮点数、空字符串(“”)、列表([])、元组(,)、字典({})和集合(集合())都是
False
,但不等于
None

这就是为什么
None
的行为方式与
True
False
1
0
不同的基本原理


至于你问题的另一部分,它似乎是一个逻辑重言:
None
False
,因为基于上述原因,Python将
None
解释为与
null
等价。通过将
not
添加到
None
中,可以反转其布尔值,从而将其转换为
True

not
是一个生成布尔值的运算符,布尔值是其操作数的倒数

我怀疑你把真值和布尔值混淆了。后者仅为
True
False
,但任何Python对象的真值都可以通过将其传递给
bool()
函数转换为布尔值。语句如
if
while
,运算符如
not
测试真值,特别是布尔值
any()
all()
测试iterable中的每个值是否为真值

因此,在测试真值时,如果某个表达式==True
如果不是某个表达式==True
,则不需要执行
。如果某个表达式
或不是某个表达式
,只需使用


请注意,
not
必须返回布尔值,因为通常不能反转真值。例如,
0
或空列表的反比是什么
0
被视为false,但任何其他整数都将被视为true,因此如果不是
false
,那么
不是0
将返回什么值?对于列表,您会在列表中放入什么来生成
not[]

not
是一个生成布尔值的运算符,布尔值是其操作数的倒数

我怀疑你是糊涂了