python的浅拷贝和深拷贝

news2024/11/25 0:38:26

1、结论

python中的拷贝有以下三种

  • 变量的赋值操作
    只是形成两个变量,实际上还是指向同一个对象

  • 浅拷贝
    Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象

  • 深拷贝
    使用copy模块的deepcopy函数.递归拷贝对象中包含的子对象,源对像和拷贝对象所有的子对象也不相同

2、变量的赋值

只是形成两个变量,实际上还是指向同一个对象
示例代码:

#定义一个CPU的类
class CPU:
    pass

#定义一个Disk的类
class Disk:
    pass

#定义一个Computer的类,包含cpu和disk的实例属性
class Computer:
    def __init__(self,cpu,disk):
        self.cpu = cpu
        self.disk = disk

#1、变量的赋值
cpu1 = CPU()
cpu2 = cpu1       #将cpu1的值赋个cup2
print(cpu1,id(cpu1))
print(cpu2,id(cpu2))   #从输出结果可以看到他们的内存地址一样

输出结果:

<__main__.CPU object at 0x000001272499A6D8> 1267629401816
<__main__.CPU object at 0x000001272499A6D8> 1267629401816

从输出结果可以看到cpu1和cpu2的内存地址一样
示意图:
在这里插入图片描述
cpu1 = CPU() 创建了一个CPU的实例对象,他的内存地址尾数为5728,cpu1里面存储的是CPU的实例对象的地址尾数为5728;
cpu2 = cpu1 cpu1赋值给cpu2, cpu2同样指向的是内存地址尾数为5728

3、浅拷贝

Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象
示例代码:

import  copy      #导入copy的库

#定义一个CPU的类
class CPU:
    pass

#定义一个Disk的类
class Disk:
    pass

#定义一个Computer的类,包含cpu和disk的实例属性
class Computer:
    def __init__(self,cpu,disk):
        self.cpu = cpu
        self.disk = disk
        
#2、类的浅拷贝
cpu1 = CPU()     #创建一个CPU的实例对象
disk = Disk()    #创建一个磁盘的类对象
computer = Computer(cpu1,disk)   #创建一个计算机的类对象
print(disk)
computer2 = copy.copy(computer)   #拷贝computer赋值给computer2
print(computer,computer.cpu,computer.disk)
print(computer2,computer2.cpu,computer2.disk)    

输出结果:

<__main__.Disk object at 0x000001EF4B37A780>
<__main__.Computer object at 0x000001EF4B37A7B8> <__main__.CPU object at 0x000001EF4B37A6D8> <__main__.Disk object at 0x000001EF4B37A780>
<__main__.Computer object at 0x000001EF4B37A7F0> <__main__.CPU object at 0x000001EF4B37A6D8> <__main__.Disk object at 0x000001EF4B37A780>

示意图:
在这里插入图片描述
computer2 = copy.copy(computer) 的时候,只把computer对象拷贝了一份赋值给computer2 ,computer对象里面的cpu 和disk对象没有拷贝,他们指向相同的内存地址。

4、深拷贝

使用copy模块的deepcopy函数.递归拷贝对象中包含的子对象,源对像和拷贝对象所有的子对象也不相同
示例代码:

import  copy  #导入copy的库

#定义一个CPU的类
class CPU:
    pass
    
#定义一个Disk的类
class Disk:
    pass

#定义一个Computer的类,包含cpu和disk的实例属性
class Computer:
    def __init__(self,cpu,disk):
        self.cpu = cpu
        self.disk = disk
cpu1 = CPU()     #创建一个CPU的实例对象
disk = Disk()    #创建一个Disk的实例对象
computer = Computer(cpu1,disk)   #创建一个计算机的类对象
#3、深拷贝
computer3 = copy.deepcopy(computer)
print(computer,computer.cpu,computer.disk)
print(computer3,computer3.cpu,computer3.disk)      

输出结果:

<__main__.Computer object at 0x0000023868BBA7B8> <__main__.CPU object at 0x0000023868BBA6D8> <__main__.Disk object at 0x0000023868BBA780>
<__main__.Computer object at 0x0000023868BBA940> <__main__.CPU object at 0x0000023868BBAF28> <__main__.Disk object at 0x0000023868BDDE10>

示意图:
在这里插入图片描述
cpu1 = CPU() 创建一个cpu的实例对象,他的内存地址尾数为A6DB
disk = Disk() 创建一个Disk的实例对象,他的内存地址尾数为A780
computer = Computer(cpu1,disk) 创建一个Computer的类对象,他的内存地址尾数为A7B8,他的子对象cpu指向的是内存地址尾数为A6DB的实例对象,computer的另外一个子对象disk 指向的是内存地址尾数为A780的实例对象。

computer3 = copy.deepcopy(computer) 深拷贝操作,复制一个computer 的实例对象,重新分配一个内存地址,他的内存地址尾数为A940, computer3变量里存储的是内存地址尾数为A940的值;内存地址尾数为A940的computer的实例对象他的子对象有cpu和disk,cpu和disk分别都会复制一份实例对象,cpu的实例对象内存地址尾数为AF28, disk的实例对象的内存地址尾数为DE10,他们跟开始的A6DB、A780是不一样的。

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

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

相关文章

【C++】开源:Web文件服务器

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍开源项目——Web文件服务器。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#x…

代码随想录day17

110. 平衡二叉树 首先是明白什么是平衡二叉树&#xff1a; 一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 然后&#xff0c;区别二叉树的高度和深度&#xff1a; 二叉树的高度&#xff1a;从叶子节点到根节点 二叉树的…

【C语言】多组输入

C系列文章目录 目录 C系列文章目录 一、什么是多组输入&#xff1f; 二、如何使用多组输入 2.1&#xff0c;试题举例讲解 2.2&#xff0c;错误解法 2.3&#xff0c;我们实现多组输入的思路 2.4&#xff0c;第一种正确的解法 2.5&#xff0c;第二种正确的解法 2.6&…

Exchange 服务器监控工具

Microsoft Exchange Server 是个消息与协作系统&#xff0c;提供了通常所需要的全部邮件服务功能&#xff0c;可以被用来构架应用于企业、学校的邮件系统或免费邮件系统。包括从电子邮件、会议安排、团体日程管理、任务管理、文档管理、实时会议和工作流等丰富的协作应用&#…

基于PyQt5的图形化界面开发——打砖块

目录 0. 前言1. 砖块类定义2. 挡板类定义3. 碰撞检测4. 小球和游戏初始化5. 完整代码6. 运行效果演示7. Pyinstaller 编译exe程序PyQt5 0. 前言 本文使用 PyQt5实现一个打砖块小游戏 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;Pycahrm Comunity 2022.3 Pyt…

自学成为一名顶级黑客(网络安全)

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 行为&#xff1a;从编程开始掌握&#xff0c;前端后端、通信协议、什么都学。 缺点&#xff1a;花费时间太长、实际向安全过渡后可用到的关键知识并不多。…

加密与解密 解密篇 逆向分析技术 (一) 栈/调用约定

目录 逆向是什么 32位软件逆向技术 1.启动函数 2.函数 函数的识别 函数的参数 利用栈进行传递 下面是通过esp来寻址 通过寄存器来传递参数 例子 例子 函数的返回值 例子 例子 逆向是什么 将可执行程序反汇编 通过分析反汇编代码来理解其代码功能&#xff08;各个…

慢速减压控制技术在预防同步辐射光源和原位透射电镜氮化硅窗口膜真空中破裂的应用

摘要&#xff1a;氮化硅薄膜窗口广泛应用于同步辐射光源中的扫描透射软X射线显微镜和原位透射电镜&#xff0c;但氮化硅薄膜只有几百纳米的厚度&#xff0c;很容易因真空抽取初期的快速压差变化造成破裂。为此&#xff0c;本文提出了线性缓变压力控制解决方案&#xff0c;即控制…

【小数据处理】从日志中获取json数据的处理

写在头上 本次分析的数据来源是SpringBoot服务输出的logback日志。具体配置参考&#xff1a; 处理工具:Notepad v7.6。处理的日志内容不易过大&#xff0c;Notepad能打开电脑不卡最好&#xff08;100M以内吧&#xff09;。如果实在过大&#xff0c;先从日志源头进行截取&…

【javaEE面试题(五)在JMM(Java Memory Model (Java 内存模型))下谈volatile的作用】【保证内存可见 和 指令有序】

volatile的作用 JMM下volatile作用 volatile 能保证内存可见性 volatile 修饰的变量, 能够保证 “内存可见性”. 代码在写入 volatile 修饰的变量的时候 改变线程工作内存中volatile变量副本的值将改变后的副本的值从工作内存刷新到主内存 代码在读取 volatile 修饰的变量的时…

微信小程序上线与发布图文步骤操作

1.上传代码 打开微信小程序&#xff0c;在微信开发者工具的工具栏中单击“上传”按钮&#xff0c;页面中弹出提示框&#xff0c;根据提示填写相应的信息&#xff0c;然后单击“上传”按钮&#xff0c;即可上传代码。 2.查看上传代码之后的版本 登录微信小程序管理后台&…

【docker】部署svn服务器,docker安装部署svn服务器

话不多说直接上步骤&#xff01; 1.下载镜像&#xff0c;创建容器 # 下载镜像 docker pull elleflorio/svn-server # 创建svn仓库目录&#xff0c;进入svn仓库目录 mkdir -p /var/svn # 创建svn服务容器&#xff0c;把容器中的svn仓库映射到本机&#xff0c;并映射3690端口 d…

基于深度学习的高精度安全帽及背心检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度安全帽及背心检测识别系统可用于日常生活中或野外来检测与定位安全帽及背心目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的安全帽及背心目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系…

动手学深度学习——线性回归(原理解释+代码详解)

目录 1、线性回归2、线性回归模型2.1 线性模型2.2 损失函数2.2.1 平方差损失函数2.2.2 整个数据集上的损失函数 2.3 随机梯度下降2.4 用模型进行预测 3、线性回归的简单实现3.1 生成数据集3.2 读取数据集3.3 初始化模型参数3.4 定义模型3.5 定义损失函数3.6 定义优化算法3.7 训…

H3C-Cloud Lab实验-OSPF配置实验

一、实验拓扑图 实验需求&#xff1a; 1、按照图示配置 IP 地址 2、按照图示分区域配置 OSPF &#xff0c;实现全网互通 3、为了路由结构稳定&#xff0c;要求路由器使用环回口作为 Router-id&#xff0c;ABR 的环回口宣告进骨干区域 4、掌握OSPF初始化流程、路由表学习的过…

基于linux下的高并发服务器开发(第一章)- GDB调试(2)1.14

&#xff08;1&#xff09;执行 gcc test.c -o test -g &#xff0c;生成test文件 &#xff08;2&#xff09;gdb test &#xff08;3&#xff09;list 查看当前文件代码 list/l &#xff08;从默认位置显示&#xff09; &#xff08;4&#xff09;l 20 list/l 行号 &#xf…

kafka(一)

一&#xff1a;kafka架构介绍 1. Brokers kafka集群包括一个或者多个服务器&#xff0c;服务器的节点叫做broker。 2. Topic 类似于数据库中的table。物理上不通的topic会分开存储。一个topic的消息会存储在多个broker上。但是在读取的时候&#xff0c;只要选择好topic&…

Centos Stream9安装Neovim的详细过程

Centos Stream9下的Neovim的安装步骤&#xff1a; 安装neovim Index of /pub/epelhttps://dl.fedoraproject.org/pub/epel/ yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm yum install -y neovim python3-neovim yum install -y …

【MySQL】不允许你不会全文本搜索

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0…

【ShenYu系列】ShenYu网关条件匹配的设计及原理分析

ShenYu网关中用到了很多有趣的设计&#xff0c;我对其中的条件匹配的实现尤其感兴趣&#xff0c;所以研究一下具体实现的原理。我这边用到的shenyu版本是2.6.0-SNAPSHOT。 应用入口 原理拆解 AbstractShenyuPlugin#execute&#xff0c;获取到SelectorData集合&#xff0c;进行…