当前位置: 首页 > 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.jsqmd.com/news/937265/

相关文章:

  • 向量空间JBoltAI:从产品痛点看AI怎么解
  • 智能音箱DIY改造:移植SONOS模块到传统户外音箱
  • 2026 深圳钻石回收实测榜单|五大正规机构真实测评! - 合扬奢侈品交易中心
  • 终极免费Mac鼠标指针定制指南:如何告别单调光标的完整解决方案
  • 1200kV/120kJ冲击发生器的结构配置
  • 2026 儿童读书会体系哪家好?TOP5 标杆品牌实测,省心省力选对课 - 资讯快报
  • 从特斯拉到理想:拆解主流车型ADAS摄像头参数,看车企的‘视觉方案’到底怎么选
  • 如何用Boss Show Time插件掌握招聘时效性:求职者的智能时间管理工具
  • 基于Arduino与PCA9685的智能LED灯光系统设计与实现
  • 大模型的典型应用场景
  • 不止于点击高亮:用Unity的QuickOutline插件,5分钟搞定AR/VR中的物体交互反馈
  • 2026 东莞石排镇新房除甲醛怎么选?实地调研对比后优先推荐东莞佰家环保科技有限公司 - 专注室内空气检测治理
  • 常见的性能测试方法
  • WuWa-Mod:鸣潮游戏模组终极指南,5分钟解锁15+隐藏功能
  • Ansaldo 167A.0100009电源驱动板
  • 2026年图文识别转文字工具保姆级教程:免费方案推荐+手把手教你用 - AI测评专家
  • 2026互联网大厂Java面试风向已变(附牛客网最新高频题+答案)
  • 1200kV/120kJ雷电冲击电压发生器的技术参数
  • 金橙子LMC1控制卡二次开发避坑指南:从‘通用错误码1’到‘UNICODE字符’的五个常见问题
  • 翎渡 LinkDo 完善日本至中国跨境供应链服务能力,推进医药健康品类合规流通
  • 2026重庆劳动仲裁维权,靠谱本土律所帮打工族高效维权 - 可口饭
  • Untrunc终极指南:免费快速修复损坏MP4/MOV视频的完整教程
  • 从DOCK 6.9到6.11:手把手教你升级UCSF DOCK并体验RDKit集成新功能
  • 英雄联盟智能助手:本地自动化工具LeagueAkari完整使用指南
  • 基于Arduino与555/4017的软硬件分离西蒙游戏设计与实现
  • 证件遗失不用跑报社,线上就能办登报挂失 - GrowthUME
  • 基于ATtiny167的电蚊拍智能化改造:电流采样与信号处理实战
  • 如何快速掌握开源游戏助手:5个实用技巧完整指南
  • OpCore-Simplify:三分钟搞定黑苹果配置的终极自动化工具
  • 武汉财税公司哪个行业口碑好 - GrowthUME