You need to enable JavaScript to run this app. Python可变不可变对象中字符串s与切片s[0:5]的内存地址差异原因?
优惠活动
大模型
产品
解决方案
定价
更多

Python可变不可变对象中字符串s与切片s[0:5]的内存地址差异原因?

字符串切片与原对象id不一致的根本原因

这个现象和字符串的不可变属性并不冲突,核心成因可以拆解为以下几点:

  • 先明确字符串不可变的准确含义:字符串是Python中的不可变对象,指的是对象创建完成后,自身承载的字符序列、长度都无法被原地修改。这个规则只约束对象自身的修改权限,不代表所有基于原字符串的派生操作,都必须返回原对象的内存引用。
  • 切片操作的默认实现逻辑:CPython解释器处理字符串[start:end]切片时,默认会根据切片截取的内容,在内存中创建一个独立的全新字符串对象,而不是直接复用原字符串的内存地址。对应你给出的测试代码:
    s = "hello!"
    print(id(s))
    print(id(s[0:5]))
    
    原字符串s的内容是长度为6的"hello!",切片s[0:5]拿到的是长度为5的"hello",二者内容、长度都存在差异,自然会生成完全独立的新对象,id()返回的内存地址自然不同。
  • 需要区分的优化特例:部分版本的CPython会从性能角度做优化——当切片区间完全覆盖原字符串、切片结果和原对象没有任何差异时,有可能直接返回原字符串的引用,不额外创建新对象。但这只是解释器的性能优化特例,不是切片操作的强制规则,不能作为切片行为的通用判断依据。
  • 常见认知误区纠正:很多初学可变/不可变概念的人,会把“不可变对象”和“所有操作必然返回原引用”划等号,这是典型的概念误解。哪怕两个字符串内容完全一致,只要是不同操作生成的独立对象,都可能拥有不同的内存地址;只要切片结果和原对象存在内容差异,就一定会生成新的独立字符串对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 20:36:03