浅拷贝和深拷贝两种不同的对象复制

发布时间:2026/7/27 23:56:54

浅拷贝和深拷贝两种不同的对象复制
浅拷贝和深拷贝两种不同的对象复制在软件开发中对象复制是一个常见且重要的操作。无论你是在处理数据结构、传递参数还是实现缓存理解如何正确地复制对象都至关重要。然而许多开发者对浅拷贝Shallow Copy和深拷贝Deep Copy的区别感到困惑甚至在实际编码中踩坑。本文将从实战角度出发通过大量代码示例深入浅出地解析这两种复制方式帮助你避免常见的陷阱。## 什么是对象复制在编程中对象复制指的是创建一个新对象该对象的内容与原始对象相同。但根据复制的方式不同结果可能大相径庭。浅拷贝只复制对象的引用而深拷贝则递归地复制所有嵌套对象。理解这一点是关键因为错误的选择可能导致数据共享或意外修改。## 浅拷贝只复制一层浅拷贝是最简单的复制方式。它创建一个新对象然后将原始对象的属性值复制到新对象中。如果属性是基本类型如整数、字符串则复制的是值如果属性是引用类型如列表、字典则复制的是引用即内存地址。这意味着新对象和原始对象共享相同的子对象。### 实战示例Python中的浅拷贝Python 提供了多种浅拷贝方式如使用copy.copy()或直接调用对象的copy()方法如果支持。下面是一个完整的可运行示例。pythonimport copy# 定义一个包含嵌套结构的类class Person: def __init__(self, name, hobbies): self.name name self.hobbies hobbies # 这是一个列表属于引用类型 def __repr__(self): return fPerson(name{self.name}, hobbies{self.hobbies})# 创建原始对象original_person Person(Alice, [reading, swimming, coding])print(原始对象:, original_person)# 使用浅拷贝创建新对象shallow_copy_person copy.copy(original_person)print(浅拷贝对象:, shallow_copy_person)# 修改原始对象的嵌套列表original_person.hobbies.append(dancing)print(\n修改原始对象后:)print(原始对象:, original_person)print(浅拷贝对象:, shallow_copy_person)# 验证是否共享引用print(\n原始对象的 hobbies 地址:, id(original_person.hobbies))print(浅拷贝对象的 hobbies 地址:, id(shallow_copy_person.hobbies))输出结果原始对象: Person(nameAlice, hobbies[reading, swimming, coding])浅拷贝对象: Person(nameAlice, hobbies[reading, swimming, coding])修改原始对象后:原始对象: Person(nameAlice, hobbies[reading, swimming, coding, dancing])浅拷贝对象: Person(nameAlice, hobbies[reading, swimming, coding, dancing])原始对象的 hobbies 地址: 1401234567890浅拷贝对象的 hobbies 地址: 1401234567890注释从输出可以看出浅拷贝只复制了Person对象本身但hobbies列表的引用被共享了。当你修改原始对象的hobbies列表时浅拷贝对象也受到了影响。这是因为浅拷贝没有递归复制嵌套对象hobbies列表的id相同证明它们是同一个内存对象。## 深拷贝完全独立深拷贝则不同它递归地复制所有嵌套对象创建一个完全独立的副本。这意味着新对象和原始对象没有任何共享引用修改一个不会影响另一个。深拷贝通常通过copy.deepcopy()实现。### 实战示例Python中的深拷贝继续使用上面的Person类这次我们改用深拷贝。pythonimport copy# 定义相同的 Person 类为了完整性重复定义class Person: def __init__(self, name, hobbies): self.name name self.hobbies hobbies def __repr__(self): return fPerson(name{self.name}, hobbies{self.hobbies})# 创建原始对象original_person Person(Bob, [gaming, music])print(原始对象:, original_person)# 使用深拷贝创建新对象deep_copy_person copy.deepcopy(original_person)print(深拷贝对象:, deep_copy_person)# 修改原始对象的嵌套列表original_person.hobbies.append(sports)print(\n修改原始对象后:)print(原始对象:, original_person)print(深拷贝对象:, deep_copy_person)# 验证是否独立print(\n原始对象的 hobbies 地址:, id(original_person.hobbies))print(深拷贝对象的 hobbies 地址:, id(deep_copy_person.hobbies))# 修改深拷贝对象的嵌套列表不影响原始对象deep_copy_person.hobbies.append(art)print(\n修改深拷贝对象后:)print(原始对象:, original_person)print(深拷贝对象:, deep_copy_person)输出结果原始对象: Person(nameBob, hobbies[gaming, music])深拷贝对象: Person(nameBob, hobbies[gaming, music])修改原始对象后:原始对象: Person(nameBob, hobbies[gaming, music, sports])深拷贝对象: Person(nameBob, hobbies[gaming, music])原始对象的 hobbies 地址: 1409876543210深拷贝对象的 hobbies 地址: 1409876543220修改深拷贝对象后:原始对象: Person(nameBob, hobbies[gaming, music, sports])深拷贝对象: Person(nameBob, hobbies[gaming, music, art])注释这里深拷贝创建了一个全新的hobbies列表注意地址不同因此修改原始对象或深拷贝对象都不会互相影响。深拷贝通过递归遍历所有嵌套对象确保每个层级都是独立的副本。这对于复杂对象如嵌套字典、自定义类实例非常有用。## 浅拷贝 vs 深拷贝实战场景选择在实际开发中选择浅拷贝还是深拷贝取决于你的需求。以下是几个典型场景-浅拷贝适用场景当你只需要复制一个对象的顶层结构且子对象不会被修改时浅拷贝性能更好。例如复制一个只包含基本类型的对象如整数、字符串或只读缓存。-深拷贝适用场景当你需要完全独立的对象避免意外修改时必须用深拷贝。例如复制用户输入数据、实现撤销功能、或处理不可变数据结构。### 性能考虑深拷贝由于需要递归复制对于大型或复杂对象性能开销可能较大。浅拷贝则快得多。在实际项目中应根据数据规模权衡。例如如果你有一个包含百万级列表的对象深拷贝可能成为性能瓶颈。## 其他语言中的实现不同语言对浅拷贝和深拷贝的支持不同。以 Java 为例Object.clone()默认是浅拷贝深拷贝需要手动实现Cloneable接口并重写clone()方法。JavaScript 中Object.assign()和展开运算符...是浅拷贝而JSON.parse(JSON.stringify(obj))是深拷贝但有局限性如不支持函数和循环引用。理解语言特性是避免错误的关键。## 总结浅拷贝和深拷贝是对象复制中的两个核心概念。浅拷贝只复制顶层对象共享引用类型属性适合简单场景深拷贝递归复制所有层级确保完全独立适合需要数据隔离的场景。通过本文的代码示例你可以看到这两种方式的实际效果和差异。在选择时务必考虑数据结构和修改需求避免因共享引用导致的 bug。记住浅拷贝是“复制指针”深拷贝是“复制内容”。掌握这一点你就能在项目中游刃有余地处理对象复制问题。

相关新闻

Agent架构设计:Planning与动态任务规划

Agent架构设计:Planning与动态任务规划

2026/7/27 23:46:54

Agent架构设计:Planning与动态任务规划 很多 Agent 的问题,不是不会调用工具,而是不知道什么时候该停下来规划。 简单任务中,边思考边执行没有问题。但当任务涉及多个模块、多个步骤时,Agent 很容易陷入一种状态&…

TMS470R1x内存与协处理器接口:从信号解析到系统集成实战

TMS470R1x内存与协处理器接口:从信号解析到系统集成实战

2026/7/27 23:46:54

1. 项目概述:深入TMS470R1x的“神经”与“外脑” 在嵌入式微处理器的世界里,处理器核心(CPU)的算力固然重要,但它与外界沟通的“桥梁”——内存接口,以及扩展其能力的“外脑”——协处理器接口,…

降重工具怎么选才不踩坑?按这几个维度排出高下

降重工具怎么选才不踩坑?按这几个维度排出高下

2026/7/27 23:46:54

降重工具怎么选才不踩坑?按这几个维度排出高下 你现在打开这篇文章,多半是重复率或者 AI 率被检测系统标红了,然后一搜"降重工具",跳出来几十个,每个都说自己最好用、效果最强,你反而更懵了。我…

iOS应用安装终极指南:5分钟掌握App Installer安装第三方应用

iOS应用安装终极指南:5分钟掌握App Installer安装第三方应用

2026/7/28 1:06:57

iOS应用安装终极指南:5分钟掌握App Installer安装第三方应用 【免费下载链接】App-Installer On-device IPA installer 项目地址: https://gitcode.com/gh_mirrors/ap/App-Installer App Installer是一款功能强大的iOS应用安装工具,让你无需通过A…

番茄小说下载器完全指南:3分钟建立你的个人数字图书馆

番茄小说下载器完全指南:3分钟建立你的个人数字图书馆

2026/7/28 1:06:57

番茄小说下载器完全指南:3分钟建立你的个人数字图书馆 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 你是否曾经遇到过这样的情况:收藏的番茄小说突然下架&#xf…

英雄联盟智能助手:5分钟掌握本地化游戏效率工具

英雄联盟智能助手:5分钟掌握本地化游戏效率工具

2026/7/28 1:06:57

英雄联盟智能助手:5分钟掌握本地化游戏效率工具 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari 是一款基于英雄联盟客…

Audio Slicer:告别手动剪辑的智能音频分割解决方案

Audio Slicer:告别手动剪辑的智能音频分割解决方案

2026/7/28 1:06:57

Audio Slicer:告别手动剪辑的智能音频分割解决方案 【免费下载链接】audio-slicer A simple GUI application that slices audio with silence detection 项目地址: https://gitcode.com/gh_mirrors/aud/audio-slicer 还在为繁琐的音频剪辑工作而烦恼吗&…

现在的你只能解决现在水平的问题

现在的你只能解决现在水平的问题

2026/7/28 1:06:57

人的能力边界,决定了当前能处理的问题范围。你今天遇到的问题,往往刚好暴露了你当前能力系统的边界。这句话不是限制你。 恰恰相反: 它解释了: 为什么解决问题会让人成长。第一层:问题的难度匹配你的能力水平 人的成长…

别再让AI乱改Flutter代码!我总结了一套边界管控方案

别再让AI乱改Flutter代码!我总结了一套边界管控方案

2026/7/28 0:56:57

文章目录一、现在AI写Flutter代码跟脱缰野马一样1.1 代码跑偏四大经典社死现场二、全套约束方案,专治AI乱改代码2.1 双层规则文件,给模型画死红线2.1.1 AGENTS.md:项目通用底线,不超50行2.1.2 .cursor/rules/拆分规则文件&#xf…

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

2026/7/27 8:45:59

目标:电脑作为RTSP 服务端,循环推送 H264/H265 视频流; RDK X5 通过 rtsp2display 拉流预览,完全不需要在开发板编译 live555。 提供两套成熟方案: ✅ 方案 A:FFmpeg(最简单,优先推…

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

2026/7/27 8:42:17

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

2026/7/27 14:56:57

说实话,提到PDF拆分再压缩,我真是被折腾得够呛。 上个月公司年度合同归档,一份300多页的PDF总合同,需要按年份拆分成三个独立文件,再分别压缩到10MB以内方便邮件发送各部门确认。我心想这还不简单?先找个海…

零基础搭建桌面智能体,OpenClaw 2.7.9 分步实操,避开绝大多数部署陷阱

零基础搭建桌面智能体,OpenClaw 2.7.9 分步实操,避开绝大多数部署陷阱

2026/7/28 0:06:55

📌 一、工具核心优势盘点 数据本地存储,安全系数高所有操作日志、文档资料均保存在本机,不会上传至云端,能够有效保护企业文件与个人隐私,规避数据泄露风险。 上手简单,零编程门槛采用全图形化可视化界面&…

计算机毕业设计之基于springboot的购物平台设计与实现

计算机毕业设计之基于springboot的购物平台设计与实现

2026/7/28 0:06:55

由于移动应用技术的持续性的快速发展,现实生活中人们大多数都是通过移动手机、电脑等智能设备来完成生活中的事务。因此,许多的人工传统行业也开始与互联网结合,不再一味的依靠人工手动,努力打造半自动数字化甚至是全自动数字化模…

豆包AI绘图提示词失效真相:NLP模型层token截断机制首次披露,3招绕过字数限制

豆包AI绘图提示词失效真相:NLP模型层token截断机制首次披露,3招绕过字数限制

2026/7/28 0:06:55

更多请点击: https://codechina.net 第一章:豆包AI绘图提示词失效现象全景扫描 近期大量用户反馈,豆包(Doubao)AI绘图功能对常规提示词(Prompt)响应异常:语义明确的指令被忽略、中英…