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 copy

original_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 copy

original_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.mfbz.cn/a/717778.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DoIP——step2:车辆发现

文章目录 前言一、IP地址配置1.1 AutoIP1.2 DHCP1.3 DoIP实体的IP地址配置流程二、车辆发现车辆声明报文内容如下:前言 完成诊断设备到车辆的物理连接并通过激活线使能诊断连接后边缘节点将会将连接状态传递至应用层,在开始车辆发现过程之前,需要先进行各自的IP地址配置,获…

“Redis中的持久化:深入理解RDB与AOF机制“

目录 # 概念 1. RDB持久化 1.1 备份是如何执行的(RDB过程) 1.2 配置文件信息 1.3 RDB持久化操作 1.4 RDB优势 1.5 RDB劣势 1.6 RDB做备份 2. AOF持久化 2.1 AOF开启及使用 2.2 异常恢复 2.3 配置文件操作 2.4 AOF持久化流程 2.5 优点 2.6…

基于Unet++在kaggle—2018dsb数据集上实现图像分割

目录 1. 作者介绍2. 理论知识介绍2.1 Unet模型介绍 3. 实验过程3.1 数据集介绍3.2 代码实现3.3 结果 4. 参考链接 1. 作者介绍 郭冠群,男,西安工程大学电子信息学院,2023级研究生 研究方向:机器视觉与人工智能 电子邮件&#xff…

代发考生战报:HCIP H12-725安全变题了

代发考生战报:HCIP H12-725安全变题了,幸好当天找客服办理的包过服务,听同考场的考生说,考试全是新题,只有1-2个是题库上的题,自己考的都考挂了,帮我答题的老师很厉害,很赞&#xff…

CesiumJS【Basic】- #006 浏览器控制台查看位置角度

文章目录 浏览器控制台查看位置角度1 目标 浏览器控制台查看位置角度 1 目标 浏览器控制台查看位置角度

探索国内首家文生软件平台:码上飞CodeFlying

前言: AIGC (AI Generated Content) 作为人工智能领域最火热的分支之一,以ChatGPT等大模型为代表,迅速掀起了全球热潮。 国内的大厂如阿里、字节跳动、百度、腾讯等也纷纷推出了自己的大模型产品,涵盖了文生文、文生图、文生视频…

计算机网络(6) UDP协议

一.UDP数据报格式 UDP(User Datagram Protocol,用户数据报协议)是一种简单的传输层协议,与TCP(Transmission Control Protocol,传输控制协议)相比,UDP提供一种无连接、不可靠的数据传…

Python云实例初始化和配置的工具库之cloud-init使用详解

概要 在云计算环境中,自动化配置和管理实例是非常重要的任务。cloud-init 是一个用于云实例初始化和配置的工具,广泛应用于各种云服务提供商(如 AWS、Azure、GCP 等)的实例启动过程。通过 cloud-init,用户可以在实例启动时自动执行脚本、安装软件包、配置网络等。本文将详…

Python学习打卡:day08

day8 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day858、数据容器(序列)的切片序列的常用操作——切片 59、序列的切片课后练习60、集合的定义和操作集合的定义集合的操作添加新元素移除元素从集合…

⭐ ▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch3 贝尔曼最优公式 【压缩映射定理】

PPT 截取必要信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 学堂在线 习题 2、过 电子书,补充 【下载:本章 PDF 电子书 GitHub 界面链接】 [又看了一遍视频] 3、总体 MOOC 过一遍 习题 学堂在线 课程页面链接 中国大学MOOC 课程页面链接 B 站 视频链…

软考系统规划与管理师伴读脑图第9章

周末发系统规划与管理师的试听视频,占用了发送次数,所以上周的脑图推迟了今天发出。 不知不觉已经发到了第9章,感叹这就是坚持积累下来的力量,其实考试也是一样的道理。

Nginx 高级应用

目录 一.使用alias实现虚拟目录 二. 通过stub_status模块监控nginx的工作状态 三. 使用limit_rate限制客户端传输数据的速度 四. nginx虚拟主机配置 1.基于端口的虚拟主机 2. 基于IP的虚拟主机 3. 基于域名的虚拟主机 nginx配置文件: /…

中电金信:银行业数据中心何去何从

20多年前,计算机走进国内大众视野,计算机行业迎来在国内的高速发展时代。银行业是最早使用计算机的行业之一,也是计算机技术应用最广泛、最深入的行业之一。近年来,随着银行竞争加剧,科技如何引领业务、金融科技如何发…

面向对象和面向过程

Python完全采用了面向对象的思想,是真正面向对象的编程语言,完全支持面向对象的基本功能,例如:继承、多态、封装等。 Python支持面向过程、面向对象、函数式编程等多种编程方式。而Java编程语言支持面向对象的编程方式&#xff0…

元数据:数据的罗塞塔石碑

在大数据时代,我们每天都在生成和处理海量数据。但数据本身,如果没有适当的上下文和描述,就像是一堆没有翻译的古老文字。这就是元数据发挥作用的地方——它是大数据世界的罗塞塔石碑,为我们提供了理解和利用数据的关键。 文章目录…

从中概回购潮,看互联网的未来

王兴的饭否语录里有这样一句话:“对未来越有信心,对现在越有耐心。” 而如今的美团,已经不再掩饰对未来的坚定信心。6月11日,美团在港交所公告,计划回购不超过20亿美元的B类普通股股份。 而自从港股一季度财报季结束…

GStreamer——教程——基础教程3:Dynamic pipelines

基础教程3:Dynamic pipelines( 动态管道 ) 目标 本教程显示了使用GStreamer所需的其他基本概念,它允许“动态”构建pipeline(管道),信息变得可用,而不是在应用程序开始时定义一条单一的管道。 完成本教程后,您将具备…

Pyshark——安装、解析pcap文件

1、简介 PyShark是一个用于网络数据包捕获和分析的Python库,基于著名的网络协议分析工具Wireshark和其背后的libpcap/tshark库。它提供了一种便捷的方式来处理网络流量,适用于需要进行网络监控、调试和研究的场景。以下是PyShark的一些关键特性和使用方…

26 岁的“天才少年”,带队面壁打通高效大模型之路

每一轮技术浪潮出现时,冲在最前面的都是朝气蓬勃的年轻人。 当大模型代表的人工智能浪潮席卷全球,作为移动互联网“原住民”的年轻开发者,可以说是最活跃的群体。他们的脸庞还有些稚嫩,但在技术和方向上有着自己的想法&#xff0…

志愿服务管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,广场论坛管理,志愿活动管理,活动报名管理 前台账户功能包括:系统首页,个人中心,志愿活动&a…