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

Python中内容相同的字符串为何id值存在差异?

核心原理

你观察到的现象是CPython(官方标准Python发行版)的*字符串驻留(String Interning)*优化机制导致的,先明确两个基础逻辑:

  • is运算符判断两个变量是否指向内存中的同一个对象,id()返回值对应该对象的内存地址,只有两个变量指向同一实例时返回值才会相等
  • 字符串驻留是解释器内置的性能优化手段:对符合特定规则的字符串,解释器会在内存中仅保留一份全局副本,后续创建相同内容的同规则字符串时直接指向这份副本,既减少重复内存占用,也能跳过逐字符比较直接通过地址判断提升相等判断效率;不符合规则的字符串不会触发这个复用逻辑,就算内容完全一致也会新建独立对象。
对应场景的规则匹配(Python 3.8版本)

编译阶段就能确定值的字符串字面量,只有满足Python标识符命名规则(仅由大小写字母、数字、下划线组成)时,才会触发自动驻留:

  • 第一个测试用例里的"latter"全为小写字母,完全符合标识符规则,因此两次赋值都指向驻留池中的同一个字符串对象,id完全一致,a is b返回True
  • 第二个测试用例里的"latter:"包含了不属于标识符合法字符的冒号:,不会触发自动驻留,两次赋值会分别在堆内存中创建独立的字符串对象,因此id不同,a is b返回False

你可以自行验证规则边界:把冒号换成下划线(标识符允许的字符)得到"latter_",再测试a is b就会返回True;换成感叹号、横杠、空格等其他非标识符字符,都会得到False的结果。

编码注意事项
  • 永远不要用is判断两个字符串的内容是否相等,内容判断请使用==运算符。字符串驻留是解释器内部的实现细节,不同Python版本、不同运行场景(比如字符串是运行时动态拼接生成、从外部输入读取得到)下的驻留行为都可能发生变化,依赖驻留逻辑写代码会产生难以排查的兼容性问题。
  • 除了符合标识符规则的编译期字符串字面量,CPython还会对-5到256区间的小整数做全局驻留,同样属于内部优化逻辑,不建议在业务代码中依赖这个特性做对象同一性判断。

内容的提问来源于stack exchange,提问作者Devang Hingu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:51:08