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

Python不可变对象绑定机制及创建独立相等对象的疑问

Python字符串不可变对象的名称绑定疑问解答

先贴出你提到的代码:

a = "first"
b = "first"
print(id(a))
print(id(b)) 
print(a is b)  

运行后输出True,下面针对你的疑问逐一说明:

为什么第二次赋值时,Python会把b绑定到已有的"first"对象?

这是Python的**字符串驻留(String Interning)**机制在工作。Python会把一些符合规则的字符串(比如由字母、数字、下划线组成的短字面量字符串,或者编译阶段就能确定的常量字符串)存入一个全局的字符串池,避免重复创建内容完全相同的不可变对象,以此节省内存、提高效率。

不是所有赋值都会检查已有对象:

  • 直接写的字面量字符串,编译时就会被处理,自动驻留;
  • 运行时动态生成的字符串(比如"fir" + "st"这种运行时拼接的,或者用户输入的字符串),默认不会自动驻留,除非你手动调用sys.intern()方法。

怎么创建内容相等但独立的新对象?

虽然不可变对象的内容没法修改,但确实能造出内容一样但内存地址不同的独立对象,常用方法有这几种:

  • 用str()构造函数包装已有字符串:
    a = "first"
    b = str(a)
    print(a is b)  # 一般输出False,极短字符串(比如""、"a")可能例外
    
  • 用全切片生成新对象:
    a = "first"
    b = a[:]
    print(a is b)  # 多数场景输出False
    
  • 通过字符串格式化动态生成:
    a = "first"
    b = f"{a}"
    print(a is b)  # 输出False
    

要注意,对于特别短的字符串,Python可能强制驻留,所以上述方法不是100%在所有场景都生效,但对付常规长度的字符串完全够用。

至于这种需求的用处:因为不可变对象的内容不会被改动,正常业务场景下完全没必要多此一举。但如果是做内存模型测试、验证对象身份的边界用例,这种方法就派得上用场。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:20:31