为何Python中两个字符串的id值相同?代码实例问询
为什么Python中x和y的id值相同?
这其实是Python的**字符串驻留(String Interning)**优化机制在起作用,我来给你一步步拆解清楚:
什么是字符串驻留?
Python为了节省内存开销、提升运行性能,会把一些常用的字符串缓存到一个全局的「字符串池」里。当你创建内容完全相同的字符串时,Python不会新建一个全新的字符串对象,而是直接复用池里已经存在的那个实例,所以这些字符串的id()(也就是对象的内存地址)自然就完全相同了。你的代码为什么触发了驻留?
看你的代码片段:
x='merchant_name' y='merchant' + '_' + 'name'
- 变量
x是直接赋值的字面量字符串'merchant_name',它完全符合Python标识符的命名规则(由字母、下划线组成),所以会被自动加入字符串池。 - 变量
y的拼接操作'merchant' + '_' + 'name',因为所有参与拼接的都是字符串字面量,Python在编译阶段就能确定最终结果是'merchant_name',所以会直接把这个预计算好的字符串加入驻留池,和x复用同一个对象。
- 什么时候不会触发自动驻留?
如果你的拼接操作包含运行时才能确定值的变量或动态表达式,结果就不会自动驻留了。比如:
x='merchant_name' sep = '_' y='merchant' + sep + 'name' print(id(x) == id(y)) # 这里大概率会输出False
因为sep是变量,Python没法在编译阶段确定拼接结果,所以运行时会新建一个字符串对象,不会复用池里的x。
- 手动触发驻留的方法
如果你想让运行时生成的字符串也被驻留,可以用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
相关产品推荐
相关产品推荐

