Python对象复制竟然有这么多种方式,赶紧学起来!

目录

1、浅拷贝:copy模块的copy()函数 📋

1.1 浅拷贝原理揭秘

1.2 实战演示:列表与字典的浅拷贝

列表浅拷贝示例

字典浅拷贝示例

1.3 注意事项:共享引用与独立对象

2、深拷贝:copy模块的deepcopy()函数 📌

2.1 深拷贝实现机制解析

2.2 深拷贝优势分析

2.3 深度遍历复制实例

列表深度拷贝示例

字典深度拷贝示例

2.4 陷阱规避:彻底分离原对象

3、列表切片法 🍏

3.1 简单快捷的列表复制技巧

示例代码

3.2 切片法与其他方法性能对比

3.3 应用场景与限制条件

应用场景

限制条件

4、对象构造器复刻 🔄

4.1 通过类的构造函数创建新实例

示例代码:基本对象复刻

4.2 应对有自定义__init__方法的对象

示例代码:带克隆方法的复刻

4.3通过类方法克隆对象

实现浅拷贝

实现深拷贝

4.4 自定义复制逻辑

5、序列化与反序列化:pickle模块 🔍

5.1 对象的存储与恢复

序列化(Pickling)

反序列化(Unpickling)

5.2 性能考量与安全提示

性能方面

安全提示

6、不可变类型复制:无需担忧 🙅‍♀️

6.1 字符串、元组的“复制”本质

字符串复制

元组复制

6.2 为何不可变对象“复制”无需担忧

实践意义

6.3 效率与内存占用分析

7、高级话题:numpy数组的复制 📊

7.1 view与copy的区别

View(视图)

Copy(拷贝)

7.2 高性能科学计算中的应用

8、总结与最佳实践 🏆



1、浅拷贝:copy模块的copy()函数 📋

在Python中,对象的复制是一个常见需求,尤其是在处理复杂数据结构时。浅拷贝通过copy模块的copy()函数实现,它创建原始对象的一个新实例,但这个新实例内部的子对象仍然是对原对象子对象的引用。这节将深入探讨浅拷贝的工作原理,并通过实战示例展示其在列表与字典中的应用,同时指出使用过程中需要注意的共享引用问题。

1.1 浅拷贝原理揭秘

浅拷贝的核心在于创建一个新对象,该对象的顶层结构是原始对象的精确副本,但对于嵌套的可变对象(如列表内的列表、字典内的字典等),新旧对象将共享这些嵌套对象的引用。这意味着,修改新对象中的顶层元素不会影响原对象,但直接修改嵌套对象则会影响两个对象。

1.2 实战演示:列表与字典的浅拷贝

列表浅拷贝示例
import copyoriginal_list = [1, 2, [3, 4]]
shallow_copy_list = copy.copy(original_list)print("Original List:", original_list)
print("Shallow Copy List:", shallow_copy_list)original_list[2][0] = 'Modified'
print("\nAfter modifying nested element in original list:")
print("Original List:", original_list)
print("Shallow Copy List:", shallow_copy_list)

输出结果:

Original List: [1, 2, [3, 4]]
Shallow Copy List: [1, 2, [3, 4]]After modifying nested element in original list:
Original List: [1, 2, ['Modified', 4]]
Shallow Copy List: [1, 2, ['Modified', 4]]

从输出可见 ,修改原列表中的嵌套列表元素后,浅拷贝列表中的对应元素也随之改变,体现了浅拷贝的特性。

字典浅拷贝示例
original_dict = {'a': 1, 'b': {'c': 2}}
shallow_copy_dict = copy.copy(original_dict)print("Original Dict:", original_dict)
print("Shallow Copy Dict:", shallow_copy_dict)original_dict['b']['c'] = 'Altered'
print("\nAfter altering nested value in original dict:")
print("Original Dict:", original_dict)
print("Shallow Copy Dict:", shallow_copy_dict)

输出结果:

Original Dict: {'a': 1, 'b': {'c': 2}}
Shallow Copy Dict: {'a': 1, 'b': {'c': 2}}After altering nested value in original dict:
Original Dict: {'a': 1, 'b': {'c': 'Altered'}}
Shallow Copy Dict: {'a': 1, 'b': {'c': 'Altered'}}

同样地 ,字典中嵌套字典的修改也影响到了浅拷贝字典的对应内容 ,再次证明了浅拷贝的浅层次复制特性。

1.3 注意事项:共享引用与独立对象

使用copy.copy()时,重要的是要意识到哪些对象会被共享引用。对于不可变类型(如字符串、数字、元组) ,由于它们不可更改,所以无论深浅拷贝都不会有问题。然而 ,对于可变类型的嵌套结构 ,开发者必须小心 ,因为浅拷贝可能导致意外的数据同步。

为了避免这种情况 ,当需要完全复制一个包含多层嵌套结构的对象时,应考虑使用copy.deepcopy()函数进行深拷贝,确保每个层级的对象都是独立的新实例。

2、深拷贝:copy模块的deepcopy()函数 📌

在Python中处理复杂数据结构时,浅拷贝可能不足以满足完全独立复制对象的需求 ,此时copy模块提供的deepcopy()函数便显得尤为重要。这一章将深入探讨深拷贝的优势、具体实现过程 ,并阐述如何有效避免因对象引用带来的潜在陷阱。

2.1 深拷贝实现机制解析

copy.deepcopy()函数通过递归地遍历对象的所有层次来实现深拷贝。这一过程包括以下几个步骤:

  • • 初始化:检查待拷贝对象的类型,确定拷贝策略。

  • • 递归拷贝:对于简单数据类型 ,直接复制值;对于复杂类型(如列表、字典) ,创建新容器,并递归地对每个元素调用deepcopy()

  • • 处理循环引用:在递归过程中,通过维护一张“备忘录”字典记录已拷贝过的对象 ,遇到相同的引用时直接返回已拷贝的对象,避免无限循环。

2.2 深拷贝优势分析

深拷贝通过递归地复制原对象及其所有子对象,确保新旧对象之间完全独立,即使嵌套结构中的元素也不会共享。这种机制提供了几个关键优势:

  • • 数据隔离:修改深拷贝后的对象不会影响原对象,这对于需要保护原始数据完整性或进行并行处理的场景极为关键。

  • • 一致性控制:在多线程或并发环境下,深拷贝可以减少竞态条件,确保每个线程处理的是数据的一个独立视图。

  • • 模型复用与实验:在构建和测试算法模型时,深拷贝允许用户基于同一初始状态快速创建多个可独立修改的实例。

2.3 深度遍历复制实例

列表深度拷贝示例
import copyoriginal_list = [1, 2, [3, 4]]
deep_copy_list = copy.deepcopy(original_list)# 修改顶层元素
deep_copy_list[0] = 'X'
print("修改后 deep_copy_list:", deep_copy_list)
print("原列表 original_list:", original_list)# 修改嵌套列表
deep_copy_list[2][0] = 'Y'
print("再次修改后 deep_copy_list:", deep_copy_list)
print("原列表 original_list不受影响:", original_list)

通过对比输出,我们可以观察到深拷贝后,无论顶层还是嵌套层次的修改都不会影响原对象。

字典深度拷贝示例
original_dict = {'a': 1, 'b': {'c': 2}}
deep_copy_dict = copy.deepcopy(original_dict)# 修改顶层键值
deep_copy_dict['a'] = 'A'
print("修改后 deep_copy_dict:", deep_copy_dict)
print("原字典 original_dict:", original_dict)# 修改嵌套字典
deep_copy_dict['b']['c'] = 'C'
print("再次修改后 deep_copy_dict:", deep_copy_dict)
print("原字典 original_dict不受影响:", original_dict)

同样,字典的深拷贝保证了即使是嵌套结构中的改变也不会波及原字典。

2.4 陷阱规避:彻底分离原对象

尽管深拷贝提供了强大的独立性,但在处理循环引用或特殊对象(如文件句柄、数据库连接等)时,仍需谨慎:

  • • 循环引用:深拷贝能够处理简单的循环引用,但复杂的循环结构可能导致效率降低或栈溢出。在设计数据结构时,应尽量避免不必要的循环引用。

  • • 非纯数据对象:对于具有副作用或状态的对象(如文件、网络连接、数据库游标等) ,深拷贝可能无法正确复制其状态或行为,这时可能需要自定义复制逻辑。

通过深入理解深拷贝的原理与实践,开发者能够更有效地管理对象生命周期,避免意料之外的数据交互 ,从而提升代码的稳定性和可维护性。

3、列表切片法 🍏

列表切片是Python中一种简洁而高效的方式,用于快速复制列表或其部分元素。这种方法不仅代码简洁,执行速度快 ,而且无需引入额外模块,是处理简单复制任务的理想选择。

3.1 简单快捷的列表复制技巧

切片法是Python中一种快速且简洁的复制列表方式。其基本语法是利用索引切片操作,即使不指定开始和结束索引,也能实现列表的完全复制。具体来说,list[:]即可创建原列表的一个全新副本。这种方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/29150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hvv--知攻善防应急响应靶机--Linux2

HW–应急响应靶机–Linux2 所有靶机均来自 知攻善防实验室 靶机整理: 夸克网盘:https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘:https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP:https://mp.weixin.…

React@16.x(31)useLayoutEffect

目录 1,介绍2,注意点 1,介绍 在用法上和 useEffect 没有任何区别,只是执行的时间点不同。 useEffect 会在组件渲染结束后,UI展示在页面上之后再执行。所以不会阻塞渲染。useLayoutEffect 会在组件渲染结束后&#xf…

课设--学生成绩管理系统(核心代码部分)

欢迎来到 Papicatch的博客 系统介绍 课设--学生成绩管理系统(一)-CSDN博客 课设--学生成绩管理系统(二)-CSDN博客 课设--学生成绩管理系统(三)-CSDN博客 目录 🍉内部接口 🍈 登…

awtk界面实现下拉屏功能

单页面下拉屏 1.src/common/下创建slidescreen.h slidescreen.c slidescreen.h #ifndef SLIDESCREEN_H #define SLIDESCREEN_H#include "awtk.h" #include "../common/navigator.h"BEGIN_C_DECLS#define false 0 #define true 1//滑屏动作值 #define SL…

Navicat 安装及初步配置指南

Navicat 是一款广泛使用的数据库管理工具,支持多种数据库,如 MySQL、PostgreSQL、SQLite 等。以下是 Navicat 安装步骤的详细说明: 在 Windows 上安装 Navicat 下载 Navicat 安装包: 访问 Navicat 官方网站:Navicat 官…

第2讲:pixi.js 绘制HelloWorld

基于第0讲和第1讲,我们增添了vite.config.ts文件。并配置了其他的http端口。 此时,我们删除掉没用的东西。 删除 conter.ts、typescript.svg 在main.ts中改成如下内容: import {Application, Text} from pixi.js import ./style.css// 指明…

C语言笔记25 •顺序表介绍•

数据结构是计算机存储、组织数据的⽅式。数据结构是指相互之间存在⼀种或多种特定关系 的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构成,以什么⽅式构成,以及数据元素之间呈现的结构。也就是能够存储数据; 存储…

中介子方程二十二

X$XFX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$…

导航台运营状态明细

Select a.部门, a.最近登陆时间, b.prev_exec_start 访问时间, b.username 访问用户, b.姓名 From zlClients A, (Select a.Prev_Exec_Start, a.Username, Terminal, c.姓名 From sys.gv_$session A, 上机人员表 B, 人员…

Nginx06-rewrite模块详解与实验

目录 写在前面Nginx06nginx rewriterewrite 模块return案例01 访问/admin/ 返回403案例02 域名间跳转 if案例03 只允许GET、POST请求,其他禁止访问 set案例04 设置是否处于维护状态,是则返回503,否则正常访问 rewrite案例05 域名跳转案例06 r…

Unity | Shader基础知识(第十四集:简单效果练习)

目录 前言 一、效果预览 1.弧形边缘光 二、效果制作 1. 制作弧形边缘光 2.弧形边缘光进阶 3.弧形边缘光调节渐变范围 4.边缘光突变 5.同心圆 三、加入世界坐标做效果 1.绘制结界 2.斑马球 3.效果合并 四、作者的碎碎念 前言 有粉丝建议说,让我继续更新…

JMU 数科 数据库与数据仓库期末总结(4)实验设计题

E-R图 实体-关系图 E-R图的组成要素主要包括: 实体(Entity):实体代表现实世界中可相互区别的对象或事物,如顾客、订单、产品等。在图中,实体通常用矩形表示,并在矩形内标注实体的名称。 属性…

基于c语言的简单的数据库

​‌​⁠​​​​​⁠​‬​‬‌​‍​​​‌​‌‬​‌​⁠​​‬‍‬​​⁠​‬‍​​‬​​​‬简单的数据库 - 飞书云文档 (feishu.cn) mydatabase: 实现一个简单的数据库,基于B树 (gitee.com)

纯css星空动画

让大家实现一个这样的星空动画效果,大家会怎么做? js,不! 其实使用css就能写 我也不藏着掖着,源码直接放下面了 <script setup></script><template><div class"box"><div v-for"i in 5" :key"i" :class"layer…

基于C#、Visual Studio 2017以及.NET Framework 4.5的Log4Net使用教程

在使用Log4Net记录日志时&#xff0c;以下是一个基于C#、Visual Studio 2017以及.NET Framework 4.5的详细步骤教程。这个教程适合初学者&#xff0c;会从添加Log4Net库、配置日志、编写日志记录代码等方面进行说明。 步骤1&#xff1a;安装Log4Net 通过NuGet安装 打开您的Vi…

信友队:南风的收集

C. [202406C]楠枫的收集 文件操作 时间限制: 1000ms 空间限制: 262144KB 输入文件名: 202406C.in 输出文件名: 202406C.out Accepted 100 分 题目描述 一年四季&#xff0c;寒暑交替&#xff0c;楠枫总是会收集每一个季节的树叶&#xff0c;并把它们制作成标本收集起来。当…

力扣 24.两两交换链表的结点

class Solution { public: ListNode* swapPairs(ListNode* head) { if(headnullptr ||head->nextnullptr) return head; auto tmpswapPairs(head->next->next); auto rethead->next; head->next->nexthead; head->nexttmp; return ret; } };

解放代码:识别与消除循环依赖的实战指南

目录 一、对循环依赖的基本认识 &#xff08;一&#xff09;代码中形成循环依赖的说明 &#xff08;二&#xff09;无环依赖的原则 二、识别和消除循环依赖的方法 &#xff08;一&#xff09;使用JDepend识别循环依赖 使用 Maven 集成 JDepend 分析报告识别循环依赖 &a…

用Python pillow 创建和保存GIF动画

使用pillow库来创建和保存gif GIFs:图形交换格式(gif)是一种位图图像格式&#xff0c;由美国计算机科学家Steve Wilhite于1987年6月15日领导的在线服务提供商CompuServe的一个团队开发。 一个GIF文件通常存储一个图像&#xff0c;但该格式允许在一个文件中存储多个图像。该格…

为什么要学习这么多“没用”的知识

最近也在看一些东西&#xff0c;很多很杂&#xff0c;底层的知识&#xff0c;高级的架构&#xff0c;正确且废话的方法论。。。越看越迷茫。和同学聊天&#xff0c;也在自嘲现在看的这些八股文&#xff0c;源代码&#xff0c;除了面试那几天用一下&#xff0c;可能一辈子都不会…