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

为何Python中两个字符串的id值相同?代码实例问询

为什么Python中x和y的id值相同?

这其实是Python的**字符串驻留(String Interning)**优化机制在起作用,我来给你一步步拆解清楚:

  1. 什么是字符串驻留?
    Python为了节省内存开销、提升运行性能,会把一些常用的字符串缓存到一个全局的「字符串池」里。当你创建内容完全相同的字符串时,Python不会新建一个全新的字符串对象,而是直接复用池里已经存在的那个实例,所以这些字符串的id()(也就是对象的内存地址)自然就完全相同了。

  2. 你的代码为什么触发了驻留?
    看你的代码片段:

x='merchant_name'
y='merchant' + '_' + 'name'
  • 变量x是直接赋值的字面量字符串'merchant_name',它完全符合Python标识符的命名规则(由字母、下划线组成),所以会被自动加入字符串池。
  • 变量y的拼接操作'merchant' + '_' + 'name',因为所有参与拼接的都是字符串字面量,Python在编译阶段就能确定最终结果是'merchant_name',所以会直接把这个预计算好的字符串加入驻留池,和x复用同一个对象。
  1. 什么时候不会触发自动驻留?
    如果你的拼接操作包含运行时才能确定值的变量或动态表达式,结果就不会自动驻留了。比如:
x='merchant_name'
sep = '_'
y='merchant' + sep + 'name'
print(id(x) == id(y))  # 这里大概率会输出False

因为sep是变量,Python没法在编译阶段确定拼接结果,所以运行时会新建一个字符串对象,不会复用池里的x。

  1. 手动触发驻留的方法
    如果你想让运行时生成的字符串也被驻留,可以用sys模块的intern()函数强制加入字符串池:
import sys
x='merchant_name'
sep = '_'
y=sys.intern('merchant' + sep + 'name')
print(id(x) == id(y))  # 现在会输出True

总结一下:你的代码里两个变量最终指向的是字符串池里同一个对象,所以id()输出相同,这完全是Python的性能优化手段~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:30:14