【Python】copy()浅拷贝与深拷贝

news2024/11/14 16:38:36

前言

由于python关于传参的方面和C语言有些出入,对于先学C在学Python的可能需要做些笔记,比如Python中def传参是直接传址,而不是传值创建局部变量等等...而到了copy函数感觉又是个新概念...

1. copy介绍

1.1 copy() 浅拷贝

Python 的 copy() 函数是 copy 模块提供的一个用于创建对象浅拷贝的工具。浅拷贝意味着新创建的对象与原始对象在内存中是两个独立的实体,但是它们包含的数据如果是可变的(比如列表、字典等),那么这些可变数据内部的元素仍然是指向原始对象的引用。

1.2 deepcopy()深拷贝

Python 的 deepcopy() 函数是 copy 模块提供的另一个工具,用于创建对象的深拷贝。与浅拷贝不同,深拷贝会递归地复制对象及其所有子对象,直到所有的元素都是新的副本,新对象和原始对象不再共享任何数据。

2.代码实现

2.1 浅拷贝

首先创建一个list类型a里面要存放[10,20]并另外一个list对象[5,6],进行浅拷贝到b

import copy
# 浅拷贝
print("浅拷贝:")
a = [10,20,[5,6]]
b = copy.copy(a)
print("a = ",a)
print("b = ",b)
# 由于浅拷贝,只是会拷贝表象,所以把a的对象是直接引用,不会拷贝的,
#在b中修改对象之后就会直接修改掉a引用的对象
b.append(30)
b[2].append(7)
print("Aftercopy_a = ",a)
print("Aftercopy_b = ",b)

在对list b最后添加一个30,和在[5,6]中添加一个7,发现输出:

浅拷贝:
a =  [10, 20, [5, 6]]
b =  [10, 20, [5, 6]]
Aftercopy_a =  [10, 20, [5, 6, 7]]
Aftercopy_b =  [10, 20, [5, 6, 7], 30]

拷贝之后不正常的地方在于,a中的[5,6]对象也被修改了,这是因为浅拷贝时 b会直接引用源对象的引用而不会拷贝一份,所以改变b的引用也会改变a的引用。

当创建变量a时,会在堆中创建对象(从左往右),栈中创建变量,指向堆中的对象,而对象开始会开辟三块空间,前两块存放10,20,第三块存放的地方指向另外一个对象,就是[5,6]

当浅拷贝后b就不一样了,b会拷贝表象(就是只开辟第一层的对象),但是第二层的对象([5,6])则会直接进行引用,所以当b.append(30)之后,b会在自己开辟的对象进行添加,而执行b[2].append(7),因为b[2]指向的就是a的[5,6],所以,a也会一起被添加7,而没有添加30。

2.2 深拷贝

理解完浅拷贝深拷贝就很好理解了,就是一模一样全部对象拷贝过来,互不影响

# 深拷贝
print("深拷贝:")
c = [10,20,[5,6]]
d = copy.deepcopy(c)
print("c = ",c)
print("d = ",d)
# 深拷贝就会把拷贝源头实现再复现一遍,在拷贝过后怎么修改都不会影响拷贝源
d.append(30)
d[2].append(7)
print("Aftercopy_c = ",c)
print("Aftercopy_d = ",d)

深拷贝:
c =  [10, 20, [5, 6]]
d =  [10, 20, [5, 6]]
Aftercopy_c =  [10, 20, [5, 6]]
Aftercopy_d =  [10, 20, [5, 6, 7], 30]

a,b指向的对象相互独立,所以只会添加在b中

3. 区别总结

  1. 拷贝深度:

    • copy() 创建的是浅拷贝(Shallow Copy)。这意味着新对象只会复制原始对象中的引用,而不是引用所指向的对象本身。因此,如果原始对象包含任何可变对象,如列表或字典,修改这些可变对象会影响到原始对象和拷贝对象。
    • deepcopy() 创建的是深拷贝(Deep Copy)。新对象会递归地复制原始对象以及所有被引用的对象。这意味着新对象和原始对象完全独立,修改新对象不会影响原始对象。
  2. 性能:

    • 由于 copy() 只是复制引用,它通常比 deepcopy() 快,并且使用的内存较少。
    • deepcopy() 需要递归地复制所有对象,这可能会消耗更多的时间和内存,特别是当对象包含大量数据或复杂嵌套结构时。
  3. 用途:

    • 当你只需要复制对象的顶层结构,并且不需要关心对象内部的可变子对象时,使用 copy()
    • 当你需要完全独立的副本,包括对象内部的所有嵌套对象时,使用 deepcopy()
  4. 自定义行为:

    • 如果对象是自定义类实例,copy() 可以通过定义对象的 __copy__() 方法来自定义其行为。
    • 对于 deepcopy(),则可以通过定义 __deepcopy__() 方法来自定义深拷贝的行为。
  5. 对不可变数据的影响:

    • 对于不可变数据类型(如整数、字符串、元组等),copy() 和 deepcopy() 之间没有区别,因为这些类型的数据不可更改,复制只是创建了数据的引用。
  6. 对内部结构的影响:

    • 使用 copy() 时,原始对象和拷贝对象共享内部的可变子对象。
    • 使用 deepcopy() 时,原始对象和拷贝对象的内部结构是完全独立的。

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

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

相关文章

如何解决 Compute 节点上的内存溢出(OOM)问题

内存溢出(Out-of-memory)是数据处理系统中常见的问题,本文将分析 OOM 的各种原因并提供有效的解决方法。 RisingWave 使用像 AWS S3 这样的共享存储,并将 Compute 节点的内存用作缓存以增强流处理性能。缓存以 Least Recently Us…

最新盘点!推荐10款简单易用的进销存软件!

本文将会盘点10款比较简单的进销存软件: 简道云、秦丝生意通、管家婆、金蝶精斗云、用友 T、百胜软件、速达软件、商陆花、Zoho Inventory、QuickBooks。 进销存软件就如同企业的得力助手。它能把企业的进货、销售和库存管理得妥妥当当,让企业清楚地掌握…

微深节能 堆取料机回转俯仰角度检测系统 格雷母线定位系统

微深节能在堆取料机回转俯仰角度检测系统中引入的格雷母线定位系统,是一项重要的技术创新,显著提升了堆取料作业的自动化水平和精确性。以下是对该系统的详细介绍: 一、系统概述 格雷母线定位系统作为高精度、无磨损的非接触式位置检测系统&a…

uni-app - - - - - 自定义状态栏

uni-app - - - - - 自定义状态栏 1. 效果图 2. pages.json配置 在需要使用自定义状态栏的页面,添加如下配置 {"path": "pages/index/index","style": {"navigationBarTitleText": "",// 使用自定义状态栏"…

apache httpclient速成

目录标题 快速使用连接池参数连接池状态清除闲置连接evictIdleConnections删除过期连接 timeToLive 和evictExpiredConnections 注意释放内存关闭流 http和netty的关系 导入依赖 <dependency><groupId>org.apache.httpcomponents.client5</groupId><artif…

STM32 - 笔记3

1 开发有基于寄存器和HAL库 在开发 STM32 系列微控制器时&#xff0c;你可以选择基于寄存器的开发方法或使用 STM32 HAL&#xff08;硬件抽象层&#xff09;库进行开发。两者各有优缺点&#xff0c;适用于不同的场景和开发需求。下面详细介绍两种方法的特点、使用场景以及示例…

头条/微头条文章采集洗稿发布软件(文字版)说明文档/使用教程

大家好&#xff0c;我是淘小白~ 今天给【头条/微头条文章采集洗稿发布软件】做一个文字版的使用说明文档&#xff01; 旧版说明文档&#xff08;含视频&#xff09;&#xff1a;https://blog.csdn.net/u012917925/article/details/141280090 注意&#xff1a;软件版本一直在…

JS实现不同网页间的数字员工与数据存储

一、目标任务&#xff1a; 要去 https://sjfw.scjs.net.cn:8801/xxgx/Enterprise/eList.aspx 根据企业名称查询到统一社会征信代码。 然后拿统一社会征信代码去 https://rzsc.sczwfw.gov.cn/portal/newOrg/orgRegister.jsp 查询法人信息。 最后两个页面不断跳转进行信息存储…

pythonnet-C#调用python脚本-含matplotlib+biopython

本地环境&#xff1a; win10&#xff0c;.NET Core 6&#xff0c;Python 3.9.13&#xff0c;pythonnet 3.0.3 测试的包&#xff1a;biopython 1.82&#xff0c;matplotlib 3.5.2 参考&#xff1a; GitHub - pythonnet/pythonnet: Python for .NET is a package that gives Py…

FPGA 如何进入 AI 领域的思考

FPGA在AI领域如何发力&#xff0c;如何抢碗饭吃&#xff1f;大多数提到是硬件加速&#xff0c;在AI工程里&#xff0c;完成数据前处理&#xff08;加速&#xff09;。大家很少提到AI模型的本身的推理过程&#xff0c;让FPGA成为AI模型的推理/算力芯片&#xff0c;这自然是 FPGA…

家校互动实现方案

目前&#xff0c;家校互动正成为最重要的校园场景之一。 大家都知道我主要做萤石的二次开发&#xff0c;这边也是给出了一个利用萤石开放平台的解决方案。 主要功能如下&#xff1a; 1.门禁管理&#xff0c;告警推送 2.可多人通过小程序看画面 3.电子班牌-父母微信一键通话…

第二代骁龙8平台手机nubia Z5拆解

这周末&#xff0c;除非外面下钞票&#xff0c;否则谁也拦不住我玩《黑神话悟空》&#xff08;附&#xff1a;两款可以玩转悟空的显卡推荐&#xff09; 天玑助力联发科力压高通~探秘MTK 5G旗舰智能手机SoC芯片——MT6989&#xff08;天玑9300&#xff09; 第二代骁龙8平台手机…

html+css+js网页设计 个人博客10个页面

htmlcssjs网页设计 个人博客10个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xf…

图像基础(2)视频信号和图像数字化的理论

#灵感# 继续读书&#xff0c;主要是视频信号相关。 视频实际上是按时间轴排列的一组图像序列。模拟图像在空间位置上有连续性&#xff0c;每一个位置上光的强度变化也有连续性。 1、视频信号分为3类&#xff1a; 分量视频、复合视频、S-Video. 分量视频是将原始视频信号&am…

无人机的工业应用场景

一、监测与检查 电力巡检&#xff1a;工业无人机在电力巡检中发挥着重要作用&#xff0c;能够替代人工进行高空、高风险作业&#xff0c;提高电网巡视效率&#xff0c;降低运维成本。通过搭载高清相机、红外热成像等设备&#xff0c;无人机可以实时传输电力线路状态&#xff0…

开放式耳机哪个品牌的好用?热榜口碑开放式耳机测评集锦!

现在市面上的开放式耳机真的越来越多&#xff0c;但是开放式耳机哪个品牌好用呢&#xff1f;可能不了解开放式耳机的就会开始犯难了&#xff0c;所以到底该怎么样选择才能选出一款比较适合自己的开放式耳机呢&#xff1f;根据这个问题&#xff0c;我作为一名耳机测评师&#xf…

【操作系统】实验:文件系统

目录 一、实验目的 二、实验要求 三、实验步骤 四、核心代码 五、记录与处理 六、思考 七、完整报告和成果文件提取链接 一、实验目的 1、掌握文件系统的基本结构和文件系统的管理方法 2、加深对两级文件目录认识和理解 3、对文件操作的系统命令实质内容和执行过程深入…

python例子:使用pygame实现五彩烟花

作品介绍 作品名称&#xff1a;使用pygame实现五彩烟花 开发环境&#xff1a;PyCharm 2023.3.4 python3.7 用到的库&#xff1a;pygame、random、sys、math 作品简介&#xff1a;该实例是一个使用 Pygame 库实现的烟花效果模拟程序。 实现过程 一、初始化Pygame pygame.…

如何在没有密码的情况下从 iPad 中删除 MDM?100% 工作

如果您遇到已使用远程管理锁恢复的 iPad 或 iPhone&#xff0c;您将需要远程管理器的登录信息。 从 iPad 中删除 MDM可能很困难&#xff0c;尤其是在您没有正确的权限的情况下。在寻求帮助时&#xff0c;许多客户访问 Apple 的官方论坛&#xff0c;却发现问题并不总是容易解决。…

java中的原子性

在Java中&#xff0c;原子性&#xff08;Atomicity&#xff09;是并发编程中的一个核心概念&#xff0c;指的是一个或多个操作在中间状态对其他线程不可见&#xff0c;且不可被线程调度机制中断的性质。一个原子操作要么全部执行成功&#xff0c;要么完全不执行&#xff0c;不会…