Python 里 is 和 == 到底差在哪?拆开小整数池、字符串驻留与 0ns 身份比较

很多人学 Python 第一个踩的坑就是 is 和 ==。一句话先说清:is 比较「是不是同一个对象」(身份),== 比较「值等不等」(内容)。下面用 CPython 3.13.14 实机跑出来的几组数据,把那些反直觉的地方拆开看。

一、小整数池:只缓存 -5 到 256

python 复制代码
a, b = 256, 256
a is b          # True
a, b = int('257'), int('257')
a is b          # False(运行时现造的,不在池里)

为什么 256 是同一个、257 却不是?CPython 启动时把 -5 到 256 的整数对象预先建好放进池子复用,任何地方用到 256 都指向同一个对象。int('257') 是运行期现造的,自然各造各的。

注意一个干扰项:在同一个代码块 里写两个 257(比如 a=257; b=257),a is b 也可能是 True------这不是小整数池,而是常量折叠 (编译器把同一个常量合并进 co_consts 的一项)。一旦跨语句、跨函数用 int('257') 构造,真相就露出来了。

二、字符串驻留(intern):字面量默认复用

python 复制代码
s1, s2 = 'hello', 'hello'
s1 is s2          # True(字面量被 intern)
s1, s2 = 'a'*20, 'a'*20
s1 is s2          # True(全同字符的重复串也会复用)
s1, s2 = 'a'*21, 'a'*21
s1 is s2          # True(实测 3.13 同样复用)

'hello' 这种合法标识符形式的字符串,CPython 默认驻留;而 'a'*20 这种运行期构造的串,3.13 实测也会复用(当结果全由同一字符组成时)。想强制驻留,调 sys.intern()。

三、可变对象:各是各的

python 复制代码
l1, l2 = [], []
l1 is l2          # False
l1 == l2          # True(空列表内容相等)
l3 = l1
l1 is l3          # True(只是同一个对象的另一个名字)

列表、字典、集合这些可变的,永远不会自动共享,所以 is 必为 False,但 == 看内容。

四、性能:is 几乎零成本

拿一个 10 万字符的字符串实测:

python 复制代码
a = 'x'*100000; b = 'x'*100000   # a、b 是两个不同对象,内容相同
a is b    # 只比指针,近乎 0ns
a == b    # 要判值,慢一个量级

is 就是比两个指针相不相等,CPU 一条指令的事;== 得进到对象的 __eq__,大对象要逐段比对。方向很确定:is 比 == 便宜得多。

五、实战里怎么选

  • 永远用 x is None,别用 x == None 。None 是单例,身份比较又快又不会被重载坑。
  • 判断枚举、单例、哨兵值(sentinel = object()),用 is。
  • 比较数值、字符串内容、容器内容,用 ==。
  • 最经典的 bug:if x == None 在 x 重载了 __eq__ 时可能误判,而 is None 永远不会。

一句话记牢:比「是不是同一个」用 is,比「长得像不像」用 ==。

相关推荐
滴啦嘟啦哒1 小时前
【具身笔记】【Piper+PI0.5】三、探究失败原因
笔记·python·vla·具身
W_326002 小时前
Python 图像处理第二十八章|OpenCV 形态学操作进阶:腐蚀、膨胀、开运算、闭运算、梯度、顶帽黑帽
图像处理·人工智能·python·opencv·计算机视觉
BD_Marathon2 小时前
【Python】标准多态和鸭子多态
python
用户8356290780512 小时前
Python 操作 Excel:创建数组公式与 R1C1 公式
后端·python
万化冥合3 小时前
怎么批量把 Word 转 PDF?
python·pdf·c#·word
~城南花已开~3 小时前
Redfish 事件接收服务搭建指南(Ubuntu Server 实测)
linux·服务器·python·ubuntu
fengyangaiGEO3 小时前
如何通过GEO优化实现外贸B2B询盘增长?
人工智能·python
jianxuan3 小时前
Spring Boot + Maven 接入 Allatori:从普通打包到可选混淆发布
spring boot·python·maven
不一样的故事1263 小时前
Prompt 工程(Prompt Engineering)
前端·人工智能·python