为什么(不是None)== True评估为True?

时间:2016-05-06 17:58:11

标签: python python-2.7

这最近在一段Python代码中绊倒了我 - 我正在检查列表中的任何值是否为False,所以我使用了类似的东西:

None

但是,我忘记了列表中有(not None) == True个值,所以在我记得第一次检查之前,我一直在混淆输出。这让我感到疑惑 - None == False背后的理由是什么? False评估为None,因此它不是自反性的,并且我不能立即清楚为什么True对象的逻辑否定应该评估为 $(document).ready(function(){ var fullpath =window.location.pathname; var filename=fullpath.replace(/^.*[\\\/]/, ''); //alert(filename); var currentLink=$('a[href="' + filename + '"]'); //Selects the proper a tag currentLink.parent().addClass("active"); }))

3 个答案:

答案 0 :(得分:3)

not是一个生成布尔值的运算符,它是它的操作数truth value的倒数。

我怀疑你将真值与布尔值混淆。后者只是TrueFalse,但任何Python对象的真值都可以转换到一个布尔值,方法是将它传递给bool()函数。像ifwhile这样的语句,andornot等运算符会测试真值,而不是特定的布尔值。 any()all()也可以测试迭代中的每个值。

因此,在测试真值时,您永远不需要if some_expression == Trueif not some_expression == True。只需使用if some_expressionif not some_expression

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

答案 1 :(得分:0)

解释原因的原因在于您的问题的评论。检查列表中的任何内容是否为false的好方法是:

if not all(values):

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

答案 2 :(得分:0)

对相关问题的回答包含一些您可能想要查看的好信息,解释有关在Python中使用TrueFalseNone的详细信息:{{3 }}

可能在你的答案中更具体的解释可以在Bill Lubanovic的O'Reilly一书 Introducing Python 中找到,他提到使用“真实性”和“虚假”概念的Python程序“检查空数据结构以及False条件。作者甚至在第88页有一个标题为“无用”的小节,其中详细阐述了:

  

None是一个特殊的Python值,当没有什么可说时,它就占有一席之地。   它与布尔值False不同,但在计算为布尔值时它看起来是假的。   [...]   您需要None来区分缺失值和空值...零值整数或浮点数,空字符串(''),列表([]),元组((,)),字典( {})和sets(set())都是False,但不等于None

这就是为什么 None行为方式背后的理由,除了TrueFalse之外,它还具有微妙的品质或10

至于问题的其他部分,它似乎是一个逻辑重言式:NoneFalse因为Python将None解释为等同于null由于上面找到的原因。通过将not添加到None,您将反转其布尔值,将其转换为True