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

Python中存储不可变值的可变对象的浅拷贝与深拷贝是否等价?

关于全不可变元素容器的浅/深拷贝效果说明

结论先行:如果列表、字典里存储的所有值全是整数、字符串、内部元素也全为不可变类型的元组这类不可变对象,浅拷贝和深拷贝的实际使用效果没有任何区别,但二者的底层执行流程存在差异。

  • 浅拷贝的核心逻辑是只创建一个新的顶层容器对象,直接把原容器里存储的所有元素的内存引用复制到新容器中。因为不可变对象本身不支持原地修改,不管是在原对象还是拷贝对象上“修改”元素,本质都是生成一个全新的不可变对象,再把引用重新绑定到对应的键/索引位置上,完全不会影响另一个容器里的元素,根本不会出现可变对象场景下“改拷贝值、原对象跟着变”的联动问题。
  • 深拷贝的默认逻辑是递归遍历容器里的每一层元素,给每个元素都创建独立的拷贝,但碰到不可变类型的时候,它会直接返回原不可变对象的引用,不会额外生成新对象——毕竟不可变对象无法修改,重复创建完全是浪费内存。
  • 二者的底层流程差异:执行深拷贝时,Python还是会老老实实递归遍历每一层元素、判断元素类型,只是碰到不可变类型时直接返回原引用,不创建新对象;而浅拷贝根本不会往内层递归,复制完第一层的引用就直接结束执行了。但因为所有元素都是不可变的,这个流程上的差异完全不会影响最终的使用效果。

可运行的验证代码示例:

import copy

# 构造所有值均为不可变类型的字典
original_dict = {"num": 123, "text": "hello", "tpl": (4, 5, 6)}
# 分别做浅拷贝、深拷贝
shallow_copy = original_dict.copy()
deep_copy = copy.deepcopy(original_dict)

# 对两个拷贝对象做修改操作
shallow_copy["num"] = 456
shallow_copy["text"] = "shallow_changed"
deep_copy["tpl"] = (7,8,9)

# 打印原字典,所有值都不会被改动
print(original_dict)  # 输出: {'num': 123, 'text': 'hello', 'tpl': (4, 5, 6)}

补充说明:如果容器里的不可变对象(比如元组)内部嵌套了列表、字典这类可变元素,就不属于“所有存储值均为不可变类型”的场景,此时浅拷贝和深拷贝会出现明显的效果差异,不在本次讨论的覆盖范围内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:03:49