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

python中的浅拷贝和深拷贝

浅拷贝和深拷贝是 Python 中复制对象的两种方式,核心区别在于嵌套对象是复制引用还是递归复制

概念说明嵌套对象关系
赋值多个变量指向同一对象完全共享
浅拷贝复制外层容器,内层元素是引用共享内层对象
深拷贝递归复制所有层级完全独立

二、赋值 vs 浅拷贝 vs 深拷贝

代码示例

import copy original = [[1, 2], [3, 4]] # 1. 赋值(只是新增一个引用) assigned = original # 2. 浅拷贝 shallow = copy.copy(original) # 3. 深拷贝 deep = copy.deepcopy(original) # 修改内层列表 original[0][0] = 99 print("原始:", original) # [[99, 2], [3, 4]] print("赋值:", assigned) # [[99, 2], [3, 4]] ← 受影响 print("浅拷贝:", shallow) # [[99, 2], [3, 4]] ← 受影响(内层共享) print("深拷贝:", deep) # [[1, 2], [3, 4]] ← 不受影响

三、浅拷贝的实现方式

1. 使用copy.copy()

import copy original = [1, 2, [3, 4]] shallow = copy.copy(original)

2. 使用切片[:]

original = [1, 2, [3, 4]] shallow = original[:]

3. 使用list()构造函数

original = [1, 2, [3, 4]] shallow = list(original)

4. 使用字典的copy()方法

original = {"a": 1, "b": [1, 2]} shallow = original.copy()

四、深拷贝的实现方式

使用copy.deepcopy()

import copy original = [1, 2, [3, 4]] deep = copy.deepcopy(original) # 可选参数:指定哪些对象不需要深拷贝 deep = copy.deepcopy(original, memo={})

自定义对象的深拷贝

import copy class Person: def __init__(self, name, friends): self.name = name self.friends = friends # 可选:自定义拷贝行为 def __copy__(self): """自定义浅拷贝""" return Person(self.name, self.friends) def __deepcopy__(self, memo): """自定义深拷贝""" new = Person(self.name, copy.deepcopy(self.friends, memo)) return new p1 = Person("Alice", ["Bob", "Charlie"]) p2 = copy.deepcopy(p1)

五、不同数据类型的拷贝行为

1. 不可变类型(int, str, tuple)

import copy # 不可变类型:浅拷贝和深拷贝没有区别 a = (1, 2, [3, 4]) # 元组包含可变元素 shallow = copy.copy(a) deep = copy.deepcopy(a) # 注意:元组是不可变的,但内层列表是可变的 # 浅拷贝:内层列表是引用 # 深拷贝:内层列表是新对象

2. 可变类型(list, dict, set)

import copy # 列表 lst = [1, 2, [3, 4]] shallow_lst = copy.copy(lst) # 内层列表共享 deep_lst = copy.deepcopy(lst) # 完全独立 # 字典 d = {"a": 1, "b": [1, 2]} shallow_d = copy.copy(d) # 内层列表共享 deep_d = copy.deepcopy(d) # 完全独立

六、特殊类型的拷贝

1. 自定义类的拷贝

import copy class Address: def __init__(self, city): self.city = city class Person: def __init__(self, name, address): self.name = name self.address = address def __repr__(self): return f"Person({self.name}, {self.address.city})" addr = Address("北京") p1 = Person("Alice", addr) # 浅拷贝 p2 = copy.copy(p1) p2.address.city = "上海" print(p1) # Person(Alice, 上海) ← 受影响 # 深拷贝 p3 = copy.deepcopy(p1) p3.address.city = "广州" print(p1) # Person(Alice, 上海) ← 不受影响

2. 循环引用的处理

import copy # 循环引用列表 lst = [] lst.append(lst) # 自己引用自己 # 深拷贝能正确处理循环引用 lst2 = copy.deepcopy(lst) print(lst2) # [...] 不会无限递归

九、最后再来一个总表

操作语法外层容器内层对象适用场景
赋值b = a共享共享只需要别名
浅拷贝copy.copy(a)新对象共享引用嵌套结构简单
深拷贝copy.deepcopy(a)新对象新对象需要完全独立

备注

  1. 浅拷贝只复制一层,内层对象是引用

  2. 深拷贝递归复制所有层,完全独立

  3. 不可变类型(int、str、tuple)的拷贝没有意义

  4. 深拷贝性能较差,非必要不使用

http://www.zskr.cn/news/1448619.html

相关文章:

  • 向量空间JBoltAI:从产品痛点看AI怎么解
  • 终极免费Mac鼠标指针定制指南:如何告别单调光标的完整解决方案
  • 从特斯拉到理想:拆解主流车型ADAS摄像头参数,看车企的‘视觉方案’到底怎么选
  • 2026 东莞石排镇新房除甲醛怎么选?实地调研对比后优先推荐东莞佰家环保科技有限公司 - 专注室内空气检测治理
  • 金橙子LMC1控制卡二次开发避坑指南:从‘通用错误码1’到‘UNICODE字符’的五个常见问题
  • Untrunc终极指南:免费快速修复损坏MP4/MOV视频的完整教程
  • 2026重庆劳动仲裁维权,靠谱本土律所帮打工族高效维权 - 可口饭
  • 英雄联盟智能助手:本地自动化工具LeagueAkari完整使用指南
  • 基于Arduino与555/4017的软硬件分离西蒙游戏设计与实现
  • 基于ATtiny167的电蚊拍智能化改造:电流采样与信号处理实战
  • 如何快速掌握开源游戏助手:5个实用技巧完整指南
  • 汕头中央空调哪家省电 - GrowthUME
  • 基于Relik与LlamaIndex的自动化知识图谱构建实战指南
  • 亲身实测!2026 深圳钻石回收五大机构,真实口碑出炉! - 合扬奢侈品交易中心
  • 告别词穷!手把手教你为Ubuntu的ibus输入法注入搜狗词库(附Python转换脚本详解)
  • 共享棋牌室装修?别急着砸钱,先想清楚谁说了算 - 资讯焦点
  • TradingAgents-CN:构建企业级AI投资决策系统的技术实践
  • 2026浙江合同纠纷律师深度指南:贾晓鹭童顺根团队的财税护盾 - 本地品牌推荐
  • AI如何重塑文案创作:从效率革命到人机协作新范式
  • CAM350开短路检查保姆级教程:从Gerber到IPC网表对比,手把手教你避坑
  • 2026昆明装修公司靠谱推荐:基于工程数据与业主真实口碑 - 商业新知
  • 2026云南旅行社怎么选?正规机构甄选实用参考指南 - 深度智识库
  • KingbaseES COPY FROM进阶玩法:从日志分析到实时数据流,解锁数据加载新姿势
  • 宁波靠谱回收精选:土著实地探店,六家报价透明正规门店 - 薛定谔的梨花猫
  • 2026 樟木头甲醛检测治理怎么选?多维度实测对比,新房除甲醛认准本土专业品牌东莞佰家环保 - 专注室内空气检测治理
  • 从GitHub到Fabric:手把手教你免费/低成本体验Microsoft Copilot全家桶(避坑指南)
  • 2026年度盘点:晋城装修公司推荐终极指南,实力口碑双冠王花落谁家? - GrowthUME
  • 2026广州外贸公司注册全攻略:政策优势、流程避坑与靠谱财税托管指南 - 资讯快报
  • 用 Service Definition Extension 给 ABAP 标准服务加一层干净的扩展口
  • 小说下载器深度解析:构建你的个人数字图书馆