Python既不是真也不是假的东西

int*_*tar 12 python boolean

我刚发现这个:

a = (None,)
print (a is True)
print (a is False)
print (a == True)
print (a == False)
print (a == None)
print (a is None)
if a : print "hello"
if not a : print "goodbye"
Run Code Online (Sandbox Code Playgroud)

产生:

False
False
False
False
False
False
hello
Run Code Online (Sandbox Code Playgroud)

所以既不是,也不等于True或False,但在if语句中表现为True.

为什么?

更新:

实际上,我刚刚意识到这并不像我想象的那么模糊.我得到a = 2的相同结果(虽然不是a = 0或a = 1,它们分别被认为等于False和True)

Len*_*bro 13

我发现这里几乎所有的解释都没有用,所以这是另一个尝试:

这里的混淆是基于"is","=="和"if"三种不同的测试.

  • "是"测试身份,即,如果它是同一个对象.在这种情况下,这显然不正确.
  • "=="测试值相等,显然,唯一具有True和False值的内置对象是True和False对象(除了数字0和1,任何数字类型).

这里有重要的部分:

  • 'if'测试布尔值.这意味着无论你给它什么表达式,它都将被转换为True或False.您可以使用bool()进行相同的操作.并且bool((None,))将返回True.将评估为False的内容列在文档中(由其他人链接)

现在也许这只是在我的头脑中更清楚,但至少我试过了.:)


Sil*_*ost 9

a是一个单元组的元组,其评估结果为True.is因此,测试对象的身份,进入False所有那些测试.==测试对象的相等性,因此,你False再次得到.

if语句a __bool__(或__nonzero__)用于评估对象,对于非空元组它应该返回True,因此你得到True.希望这能回答你的问题.

编辑:原因TrueFalse等于10分别是因为 bool类型实现为类型的子int类.