Python中 is 与 == 的区别及字符串驻留机制详解

陈默
陈默
发布时间:2026-10-13 | 4人浏览过
原创

本文深入解析Python中 is 与 == 的核心区别,前者比较内存地址,后者比较值。重点讲解字符串驻留(Intern)机制对拼接性能的影响,以及-5到256整数缓存规则。通过多个代码示例对比不同场景下的行为,并说明交互式环境与IDE解释器优化的差异,最后给出使用 is 判断 None 的最佳实践建议。

is 与 == 的核心概念区别

is 和 ==

首先参考官方文档对 is 和 == 的定义。is 用于检查对象标识符(object identity),即验证两个变量是否指向内存中的同一块地址(等同于检查 id(a) == id(b));而 == 用于检查相等性(equality),即验证两个对象引用的值是否相同(等同于检查 a.eq(b))。这一机制与Java类似,但Java中 == 比较内存地址,equals() 比较值,Python则相反。

is ==
概念 对象标示符 相等
作用 比较对象在内存中的地址 检查两个对象引用的值
示例 id(a) == id(b) a.eq(b)

字符串驻留机制与性能影响

字符串驻留机制

Python采用字符串驻留(Intern)机制,当创建值相同的字符串(如标识符)时,直接复用字符串池中的现有对象,避免频繁创建和销毁,从而提升效率并节省内存。因此,频繁的字符串拼接和修改操作会影响性能。

由于字符串是不可变对象,所有操作(如replace)实际上都是创建新对象。这就是为什么在拼接多个字符串时,推荐使用 join() 而非 + 运算符。join() 会预先计算所有字符串的总长度,一次性分配内存并拷贝数据,仅创建一次新对象。

需要注意的是,并非所有字符串都会触发驻留机制。只有仅包含下划线、数字和字母的字符串才会被自动驻留。

字符串与列表的 is/== 行为示例

相关示例

示例一


a = "hello"
b = "hello"
print(a is b) # 输出 True 
print(a == b) # 输出 True

值相同的简单字符串在字符串池中仅保存一份,这要求字符串必须不可变。因此,变量 a 和 b 指向同一个对象。

示例二


a = "hello world"
b = "hello world"
print(a is b) # 输出 False
print(a == b) # 输出 True 

变量 a 和 b 包含空格,因此不会被驻留(空格不属于Python标识符),故 a 和 b 不是同一对象。需注意,此结果仅在交互式命令行中有效;在PyCharm或保存为文件执行时,解释器会进行部分优化,结果可能不同。

示例三


a = 'ab' + 'c' is 'abc'
print(a) # 输出 True
ab = 'ab'
b = ab + 'c' is 'abc'
print(b) # 输出 False

第一个表达式 'ab'+'c' 在编译期(compile-time)求值,被替换为 'abc',因此输出 True;第二个表达式 ab+'c' 在运行期(run-time)拼接,未被自动驻留,因此输出 False。

示例四


a = [1, 2, 3]
b = [1, 2, 3]
print(a is b) # 输出 False
print(a == b) # 输出 True 

a 和 b 是列表,尽管内容相同,但它们是不同的对象。

示例五


a = [1, 2, 3]
b = a
print(a is b) # 输出 True 
print(a == b) # 输出 True

将 a 的引用赋值给 b(引用赋值),两者在内存中指向同一个对象。

示例六


a = ["I", "love", "Python"]
b = a[:]
print(a is b) # 输出 False
print(a == b) # 输出 True
print(a[0] is b[0]) # 输出 True
print(a[0] == b[0]) # 输出 True

b 通过切片操作重新分配了对象(切片赋值),但值与 a 相同。由于切片拷贝是浅拷贝,列表中的元素并未重新创建,因此 a[0] is b[0] 输出为 True。

整数缓存规则与解释器优化差异

示例七


a = 1
b = 1
print(a is b) # 输出 True
print(a == b) # 输出 True

Python会对较小的整数对象进行缓存,后续使用时直接从缓存中获取。

示例八


a = 320
b = 320
print(a is b) # 输出 False
print(a == b) # 输出 True

Python仅缓存较小范围的整数对象(范围为 [-5, 256]),而非所有整数。同样,此行为在交互式命令行与PyCharm或文件执行中可能不同,主要源于解释器的优化策略。

性能对比与最佳实践建议

is 与 == 对比

is 与 == 相比计算速度更快,因为 is 不能重载,无需进行特殊函数调用,而是直接比较两个整数的 id,减少了函数调用的开销。而 a == b 等同于调用 a.eq(b),该方法继承自 object,原本也比较对象 id,结果与 is 一致。但大多数Python对象会重写 object 的 eq 方法以定义基于内容的比较,因此 == 比较的是对象属性的值。

在变量与单例值(如 None)进行比较时,应使用 is。目前最常见的用法是判断对象是否为 None,推荐写法为:xxx is None;判断不为 None 的推荐写法为:xxx is not None。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表