Python中+False为何与False不是同一对象?
为什么
+False和False不是同一个对象? 嘿,这个问题乍一看确实有点反直觉,我刚看到的时候也愣了一下,不过拆解开就很清晰了~
核心原因:布尔类型是整数的子类,+运算符会触发类型提升
Python里的bool类型其实是int的子类,False本质上就是值为0的布尔实例,True是值为1的布尔实例。当你对布尔值使用一元+运算符时,Python会执行数值运算逻辑,这时候会把布尔对象自动提升为int类型,返回一个全新的整数实例。
我们可以用type()直接验证这一点:
>>> type(False) <class 'bool'> >>> type(+False) <class 'int'>
你看,+False返回的是int类型的0,而不是原来的bool类型的False——这两个本来就是不同类型的对象,它们的内存地址(id)自然不一样。
为什么测试用例是assertIsNot而不是assertIs?
那个测试用例完全没问题,不是笔误。虽然+False的值和False相等(用==判断会返回True):
>>> +False == False True
但它们的对象身份是完全不同的——一个是布尔实例,一个是整数实例。assertIsNot就是要验证这个行为:确保+运算符确实把布尔值转换成了整数对象,而不是返回原布尔对象。
关于那个SyntaxWarning
你看到的SyntaxWarning: "is" with a literal. Did you mean "=="?是Python的常规提示,因为通常我们用==比较值,用is比较身份,但这里你就是要验证对象身份,所以这个警告可以忽略。用id()查看内存地址是更直接的验证方式,就像你做的那样,确实两个对象的id完全不同。
内容的提问来源于stack exchange,提问作者Amir reza Riahi
相关产品推荐
相关产品推荐

