当前位置: 首页 > news >正文

Python中的深拷贝与浅拷贝

目录

1. 概念简介

1.1 浅拷贝(shallow copy)

1.2 深拷贝(deep copy)

3. 不同类型拷贝行为总结

4. 元组中包含可变对象的特殊情况

5. 何时使用浅拷贝或深拷贝?

6. 重要提醒


1. 概念简介

1.1 浅拷贝(shallow copy)

  • 定义:复制最外层对象,但内部元素(子对象)仍然是原对象中元素的引用(地址共享)。
  • 表现
    • 不可变对象(如整数、字符串、元组等)浅拷贝不会创建新对象,拷贝后对象和原对象指向同一个内存地址(id相同)。
    • 可变对象(如列表、字典、集合等)浅拷贝会创建一个新的最外层对象(id不同),但内部元素的引用是共享的(id相同)。
  • 代码示例:
import copy# 不可变对象:整数列表中的元组
immutable_obj = (1, 2, 3)
immutable_obj_shallow = copy.copy(immutable_obj)
print(f"id(immutable_obj): {id(immutable_obj)}")
print(f"id(immutable_obj_shallow): {id(immutable_obj_shallow)}")  # id相同# 可变对象:列表包含列表
mutable_obj = [1, 2, [3, 4]]
mutable_obj_shallow = copy.copy(mutable_obj)
print(f"id(mutable_obj): {id(mutable_obj)}")
print(f"id(mutable_obj_shallow): {id(mutable_obj_shallow)}")  # id不同,外层对象新建print(f"id(mutable_obj[2]): {id(mutable_obj[2])}")
print(f"id(mutable_obj_shallow[2]): {id(mutable_obj_shallow[2])}")  # 内部列表引用相同

解析:

  • 对于不可变元组,浅拷贝后id相同,说明没有创建新对象。
  • 对于可变列表,浅拷贝创建了新的外层列表(id不同),但内部的子列表仍然是共享的(id相同),修改内部子列表会影响原对象。

1.2 深拷贝(deep copy)

  • 定义:递归复制最外层对象及其所有子对象,生成一个完全独立的新对象。
  • 表现
    • 不论可变或不可变,深拷贝都会创建新的最外层对象(但对纯不可变对象,通常复用内存不创建新对象)。
    • 对于可变子对象,深拷贝会递归复制,子对象的id与原对象不同,完全独立。
    • 对于不可变子对象,Python通常复用内存,不会重复创建。
  • 代码示例:
import copy# 不可变对象:简单元组
immutable_obj = (1, 2, 3)
immutable_obj_deep = copy.deepcopy(immutable_obj)
print(f"id(immutable_obj): {id(immutable_obj)}")
print(f"id(immutable_obj_deep): {id(immutable_obj_deep)}")  # id相同,未创建新对象# 可变对象:列表包含列表
mutable_obj = [1, 2, [3, 4]]
mutable_obj_deep = copy.deepcopy(mutable_obj)
print(f"id(mutable_obj): {id(mutable_obj)}")
print(f"id(mutable_obj_deep): {id(mutable_obj_deep)}")  # id不同,外层对象新建print(f"id(mutable_obj[2]): {id(mutable_obj[2])}")
print(f"id(mutable_obj_deep[2]): {id(mutable_obj_deep[2])}")  # 内部列表id不同,递归复制

解析:

  • 对于不可变元组,深拷贝返回原对象本身,没有创建新对象,id相同。
  • 对于可变列表,深拷贝递归复制了所有子对象,包括内层列表,所有对应对象的id都不同,完全独立。

3. 不同类型拷贝行为总结

类型赋值浅拷贝深拷贝
不可变对象引用,id相同不创建新对象,id相同不创建新对象,id相同
可变对象引用,id相同新建外层对象,内部引用共享递归新建所有对象,完全独立
元组(不可变)引用,id相同新建元组对象,内部元素引用共享新建元组对象,内部元素递归复制

4. 元组中包含可变对象的特殊情况

  • 元组本身不可变,浅拷贝会创建新的元组对象(id不同)。
  • 元组内的可变元素(如列表)浅拷贝时不会复制,仍然是共享引用(id相同)。
  • 深拷贝时,元组和其中所有子对象都会被递归复制,子对象id也不同。

5. 何时使用浅拷贝或深拷贝?

情况选择理由选择拷贝类型
对象结构简单,无嵌套或子对象不可变性能开销小,快速复制浅拷贝
对象包含可变的嵌套子对象,需独立修改需要完全独立的对象深拷贝
只需复制最外层对象,内部共享子对象节省内存,避免重复复制浅拷贝
复杂数据结构备份或递归操作防止意外修改原始数据深拷贝

6. 重要提醒

  • 不可变对象的浅拷贝和深拷贝效果相同,Python会复用内存。
  • 浅拷贝不会递归复制内部子对象,修改嵌套的可变子对象会影响原对象。
  • 深拷贝性能开销较大,不必要时避免使用。

文章转载自:

http://Lhm2HGvK.tznLz.cn
http://H2aMsQbL.tznLz.cn
http://tjv1SR7R.tznLz.cn
http://MkaFax95.tznLz.cn
http://IqJEwkEz.tznLz.cn
http://fj1R15h6.tznLz.cn
http://M6pbyvml.tznLz.cn
http://WqRg0BgM.tznLz.cn
http://8rB79myu.tznLz.cn
http://0SfS3nCL.tznLz.cn
http://taTfuCdt.tznLz.cn
http://dqFhqhzU.tznLz.cn
http://ebhU5NDx.tznLz.cn
http://AWHklNnL.tznLz.cn
http://DUHxrH9P.tznLz.cn
http://4Xg9F3oQ.tznLz.cn
http://YvTtUIc2.tznLz.cn
http://tnAHaYjJ.tznLz.cn
http://80fVJg3v.tznLz.cn
http://RkMtHLcA.tznLz.cn
http://8dVoNt9M.tznLz.cn
http://E3Dx1JWw.tznLz.cn
http://JTQb8H2i.tznLz.cn
http://5sYPDrby.tznLz.cn
http://mYnbEwW6.tznLz.cn
http://OQEuBWub.tznLz.cn
http://QoQkCxyI.tznLz.cn
http://wgeU58TP.tznLz.cn
http://gjkfMMqb.tznLz.cn
http://xqmVonpR.tznLz.cn
http://www.dtcms.com/a/381478.html

相关文章:

  • 冒泡排序与选择排序以及单链表与双链表
  • 垂直大模型的“手术刀”时代:从蒙牛MENGNIU.GPT看AI落地的范式革命
  • 【高并发内存池】六、三种缓存的回收内存过程
  • 缓存常见问题与解决方案
  • 【pure-admin】登录页面代码详解
  • 初学鸿蒙笔记-真机调试
  • 反序列化漏洞详解
  • 使用 vue-virtual-scroller 实现高性能传输列表功能总结
  • python 实现 transformer 的 position embeding
  • 003 cargo使用
  • 制作一个简单的vscode插件
  • 【算法详解】:从 模拟 开始打开算法密匙
  • kubeadm搭建生产环境的单master多node的k8s集群
  • RocketMQ存储核心:MappedFile解析
  • 7.k8s四层代理service
  • Stable Virtual Camera:Stability AI等推出的AI模型 ,2D图像轻松转3D视频
  • Golang并发编程及其高级特性
  • 给AI配一台手机+电脑?智谱AutoGLM上线!
  • 怎么在手机上选择一款好用的桌面待办清单工具
  • 傲琪人工合成石墨片:破解智能手机散热困境的创新解决方案
  • LeetCode 刷题【74. 搜索二维矩阵、75. 颜色分类、76. 最小覆盖子串】
  • 【Linux】【实战向】Linux 进程替换避坑指南:从理解 bash 阻塞等待,到亲手实现能执行 ls/cd 的 Shell
  • SRE 系列(七)| 从技术架构到团队组织
  • 网络安全-vulnhub-Web developer 1
  • 国产延时芯片EH3B05上电延时3秒开关机芯片方案超低功耗
  • vivado下载程序后不弹出ila窗口
  • 【VC】 error MSB8041: 此项目需要 MFC 库
  • S7-200 SMART PLC 安全全指南:配置、漏洞解析与复现防护
  • 点可云进销存商城如何部署在微信小程序
  • 安卓学习 之 界面切换