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

Python如何管理字符串对象?解析字符串内存地址差异的异常行为

为什么Python字符串的内存地址表现不一样?

这事儿得从Python的**字符串驻留(String Interning)**机制说起——简单说就是Python会把一些常用的小字符串存在一个“字符串池”里,避免重复创建一模一样的对象,以此节省内存、提高效率。咱们拆开来分析两种场景:

1. 循环里的情况:输出True True False False False

咱们逐个看循环里的count值:

  • 当count=0时,str1和str2都是空字符串'',空字符串是Python默认会驻留的对象,所以俩变量指向同一个内存地址,id(str1) == id(str2)自然返回True。
  • 当count=1时,'a'是单个字符的字符串,这类短字符串(尤其是单字符)也会被自动驻留,所以两个'a'其实是同一个对象,id相等,返回True。
  • 当count=2、3、4时,也就是生成'aa'、'aaa'、'aaaa'的时候,因为这两个字符串是运行时动态生成的(count是循环变量,编译阶段没法确定它的值),Python没法提前把它们放进字符串池,所以每次循环都会创建全新的字符串对象,str1和str2的内存地址自然不一样,就返回False了。

2. 单独赋值的情况:返回True

当你直接写:

str1 = 'aaa'; str2 = 'aaa'; print(id(str1) == id(str2))

这两个'aaa'是代码编译阶段就能确定的字面量,Python会自动把这类符合规则的短字符串(由字母、数字、下划线组成,长度通常不超20)驻留到字符串池里,所以str1和str2其实指向同一个对象,id相等,返回True。

额外补充:手动触发驻留

如果想让循环里的所有情况都返回True,可以用sys.intern()手动强制驻留字符串:

import sys
for count in range(5):
    str1 = sys.intern('a' * count)
    str2 = sys.intern('a' * count)
    print(id(str1) == id(str2))

这样不管是动态生成的还是字面量,都会被放进字符串池,所有输出就都是True了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:16:28