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
相关产品推荐
相关产品推荐

