直接回答:不可变数据创建后就不能修改,任何"改动"都产生新对象。它从源头消除了一整类 bug:共享状态被意外篡改。
展开解析:带来的安全性——
- 并发安全:不可变对象天然线程安全,多线程共享无需加锁、无需防御性拷贝,Java 的
String、Scala/Rust 的默认不可变集合都因此受益; - 可推理:函数拿到不可变参数,可以确定它在函数返回后仍是原值,配合纯函数实现引用透明,bug 定位范围大幅缩小;
- 可安全共享与缓存:不可变对象可放心当字典 key、放进 set、作缓存键,不怕哈希值中途变化;
- 历史可追溯:每次变更生成新版本,撤销/重做、时间旅行调试、审计日志都容易实现(React、Redux 的状态管理正基于此)。
Python 中的实践:用 tuple/frozenset 替代 list/set 传参;@dataclass(frozen=True) 定义不可变数据类;不原地修改参数,返回新对象。
代价与对策:频繁拷贝带来内存与性能开销,可用结构共享(持久化数据结构,新老版本共享未变部分,如 Clojure 的集合、Python 的 pyrsistent)缓解。追问:不可变是否等于深不可变(浅冻结的陷阱:不可变容器里装着可变对象)。