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 等不可变类型,浅拷贝 / 深拷贝都不会创建新对象,而是直接引用原对象(因为不可变类型修改会生成新对象,拷贝无意义)。

相关推荐
用户9562562542914 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结
python·api
威哥爱编程14 小时前
模拟面试智能体开发实战 02:回答等半分钟,谁还愿意练?把服务端和流式输出搭起来
python·agent·harmonyos
威哥爱编程15 小时前
模拟面试智能体开发实战 01:面试挂了都不知道挂在哪?用 Python 给自己造一个随叫随到的 AI 面试官
python·agent·harmonyos
2601_9679801115 小时前
Python行情API量化 02:顺序拉 20 要 2 秒?并发批量把时间压到 0.5 秒
python·api·限流·并发·量化
伞伞悦读15 小时前
【第81期】特征缩放怎么选:标准化、MinMax 与 Robust 的原理、泄漏对照和完整实验
人工智能·python·深度学习·机器学习
新*16 小时前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化
javascript·python·websocket·性能优化·blob·zlib·arraybuffer
卷无止境18 小时前
mathmodel-figure-templates 以及两个上手案例
后端·python
锋行天下18 小时前
服务器 Python 2.7 装不了 langgraph-cli?用本地生成 Dockerfile 曲线救国
人工智能·后端·python
一条大祥脚18 小时前
深入理解 PyTorch FlexAttention:从 Score Mod 到 Mask Mod 的稀疏加速之道
人工智能·pytorch·python·注意力机制·flex attention·可编程注意力
2601_9679801119 小时前
Python自动化办公:模块、库与样式调整教程
python·excel·自动化办公·openpyxl·样式调整