Python 中常见内置数据类型的可变性mutability特性不可变类型Immutable一旦创建其内容不能被修改。若尝试“修改”实际上是创建了一个新对象原对象保持不变。包括int,float,complex数值类型str字符串tuple元组可变类型Mutable创建后可通过方法或赋值操作直接修改其内容内存地址不变。包括listdictset⚠️ 注意可变性与“是否能重新赋值变量”无关变量名总可重新绑定而是指对象自身内容能否就地修改。例如a[1,2]a.append(3)# ✅ 可变原 list 对象被修改id 不变bhellob world# ❌ 字符串不可变生成新 str 对象b 指向新对象id 改变此外frozenset是set的不可变版本bytes不可变bytearray可变自定义类默认可变取决于如何实现。Python 将str和tuple设计为不可变类型是经过深思熟虑的语言设计决策主要基于安全性、性能优化、哈希一致性和语义清晰性四大核心考量✅好处可哈希性Hashability→ 支持用作字典键/集合元素不可变对象的内容不会改变 → 其哈希值hash()在生命周期内恒定 → 可安全用于dict键或set成员。例如{(a, b): 1}合法但{[a, b]: 1}会报TypeError: unhashable type: list。内存与性能优化字符串不可变 → Python 可安全实现字符串驻留string interning相同字面量字符串尤其标识符复用同一内存对象如a hello; b hello→a is b常为True节省内存并加速比较。元组不可变 → 创建后无需预留扩容空间内存布局紧凑访问更快也便于编译器优化如字面量元组在函数中常被静态缓存。线程安全与逻辑可靠性不可变对象天然线程安全无竞态条件函数接收str或tuple参数时调用者无需担心被意外修改增强接口契约性与可预测性。语义明确表达“只读数据结构”意图tuple常用于表示固定结构的记录如(x, y, z)坐标、数据库行不可变性强化其“数据容器”而非“动态列表”的语义str表示文本内容修改应显式通过新字符串表达如s.upper()返回新串避免隐式副作用。❌限制频繁拼接字符串效率低s x每次都新建字符串对象 → O(n²) 时间复杂度推荐用.join(list)或io.StringIO。元组无法就地修改需转为list修改后再转回 → 额外开销若需高频增删应选用list。误用风险开发者可能因不理解不可变性而写出低效代码如循环中反复字符串。 补充不可变性 ≠ 绝对禁止变化而是对象自身状态不可变变量名仍可重新绑定s s !是创建新对象并重赋值非修改原对象。