You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:27:46