python深拷贝与浅拷贝机制

之前复现一篇论文FFNO,开源代码写得很恶心,用到深拷贝、浅拷贝,改起来很麻烦。这里记录一下python深拷贝、浅拷贝机制以便后续学习使用。

先明确 Python 中变量的存储逻辑:

  • 对于不可变类型(如 int、str、tuple):变量存储的是值本身,修改时会创建新对象。
  • 对于可变类型(如 list、dict、set):变量存储的是对象的内存地址(引用),修改时会直接操作原对象。

拷贝的核心差异,本质是「是否复制了可变子对象的引用,还是复制了子对象本身」。

浅拷贝(Shallow Copy)

浅拷贝会创建一个新的容器对象,但容器内的元素依然引用原对象的内存地址(只拷贝 "第一层",子对象共享)。

代码示例:

python 复制代码
import copy
# 原对象(嵌套可变类型)
original = [1, [2, 3], 4]
# 浅拷贝
shallow_copied = copy.copy(original)

# 1. 修改原对象的不可变元素(第一层)
original[0] = 100
print("原对象:", original)       # [100, [2, 3], 4]
print("浅拷贝对象:", shallow_copied)  # [1, [2, 3], 4] (第一层独立)

# 2. 修改原对象的可变子对象(第二层)
original[1][0] = 200
print("原对象:", original)       # [100, [200, 3], 4]
print("浅拷贝对象:", shallow_copied)  # [1, [200, 3], 4] (子对象共享,同步变化)

深拷贝(Deep Copy)

深拷贝会创建一个全新的容器对象,并且递归地复制所有嵌套的子对象(所有层级都独立,与原对象完全隔离)。

python 复制代码
import copy

# 原对象(嵌套可变类型)
original = [1, [2, 3], 4]
# 深拷贝
deep_copied = copy.deepcopy(original)

# 修改原对象的可变子对象
original[1][0] = 200
print("原对象:", original)       # [1, [200, 3], 4]
print("深拷贝对象:", deep_copied)  # [1, [2, 3], 4] (完全独立,无影响)

两者之间的对比

要注意的是,对于 int、str、tuple 等不可变类型,浅拷贝 / 深拷贝都不会创建新对象,而是直接引用原对象(因为不可变类型修改会生成新对象,拷贝无意义)。

相关推荐
张张123y6 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
happylifetree10 小时前
Python67:核心语法-函数进阶-参数类型(函数作为参数)
python
小羊没烦恼!11 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
quantdash_cc11 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
镜子AI11 小时前
镜子AI工程实践:用 Python 做 GEO 实体一致性审计,并自动生成 JSON-LD 结构化数据
人工智能·python·json
2601_9628857216 小时前
如何用 Python 计算 VaR 和 CVaR(在险价值)?
开发语言·python
李航198316 小时前
DeepSeekAI建模三 - 实战建模一组柜子
人工智能·python·计算机视觉·ai·ai编程
严谨的麻辣烫17 小时前
静态代理 IP 的出口一致性如何验证?Python 请求检测与异常排查
开发语言·python·http·网络安全
我命由我1234517 小时前
5-1.Python 编码进阶 - 函数进阶(参数、返回值、递归、函数作为参数传递、lambda 匿名函数)
java·服务器·数据库·后端·python·java-ee·python3.11
FITA阿泽要努力18 小时前
Fork Agent:共享上下文的艺术
开发语言·python·agent