Python 浅复制与深复制(Shallow Copy Deep Copy)

news2024/10/2 6:30:32

在Python中,赋值语句的意义是在对象与变量之间建立引用关系,相当于给对象起了名字。对于复合类型对象,由于其可以保存其他类型对象的引用,而在复制时即引出了“仅复制引用关系”或“同时复制引用对象”两种选择,即浅复制和深复制。

一、浅复制示例

Python中的赋值语句是建立对象与变量名的引用关系,下面语句即是将list1与列表对象建立引用关系:

list1 = ['abc']

在这里插入图片描述
而对于集合类型的对象,其中元素保存的可能又是到其他对象的引用,下面语句中,list1保存了3个对象,其中列表和元组是引用,指向其实际对象:

list1 = ['abc', [1,2], (3,4)]

在这里插入图片描述
对于list1,当对其进行复制时,就有了浅复制和深复制两种选择。默认的构造函数或切片采用的都是浅复制。下面代码中,list2是list1的浅复制副本(副本共享内部对象的引用):

list1 = ['abc', [1,2], (3,4)]
list2 = list1[:] 或list2 = list(list1)

在这里插入图片描述
改变list2中列表的元素,list1中的列表也改变了,可以证明它们引用的是相同的对象:

list2[1].append(3)
list1[1]

在这里插入图片描述
对象引用关系如下:
在这里插入图片描述

二、深复制示例

有时我们需要对象的深复制,即集合内部对象不共享引用。利用copy模块的deepcopy()函数可以为任意对象做深复制(其还有个copy()函数可以做任意对象的浅复制)。

下面是list1的深复制引用关系图,从结果来看,list1和list2中的列表已经独立复制了,为什么元组还是指向同一个对象?这其实是python内部的一个优化机制:

import copy
list1 = ['abc', [1,2], (3,4)]
list2 = copy.deepcopy(list1)

在这里插入图片描述
我们先测试一下变更list2中的列表和元组对象,可以发现list1和list2已经互不影响了:

list2[1].append(3)
list2[2] += (5,6)

在这里插入图片描述

2.1 python对不可变对象的优化

上面的例子中,我们对list2[2]的元组对象做+=操作,这个应该做原地变更,但由于元组是不可变对象,所以python会重新创建一个元组,然后重新绑定至list2[2]的引用上,从结果上来看,深复制对于不可以用对象依然复制引用关系并不会造成复制对象间的相互影响。
在这里插入图片描述
在深复制时,我们期望的是python会复制所有引用对象,而不仅仅是引用关系,但它会欺骗你。对于不可变对象python依然会复制引用关系,这其实是一种优化,防止重复创建对象。这在普通的常量上也可以体现,下面示例创建了2个变量a,b都等于1,但实际上python只创建了1个数字对象,然后让a,b都指向它(通过id()函数和is可以确定a,b指向的是同一个对象):

a = 1
b = 1
id(a), id(b)
a is b

在这里插入图片描述

可以总结出:浅复制可能会造成复制对象间的相互影响,有时你可以利用这种影响传递变化,但有时也可能造成意想不到的影响,特别是在类编写中,尽量避免用可变对象作为初始化参数,其可能造成实例之间的互相干扰。

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

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

相关文章

通过Annotation将用户操作记录到数据库表功能实现

一、背景 在用户对我们所开发的系统访问的时候,需要我们的系统具有强大的健壮性,使得给与用户的体验感十足。在业务开发的过程中,我们通过将几个相关的操作绑定成一个事件,使得安全性以及数据的前后一致性得到提高。但是在溯源方面…

数据结构(二)——线性表(顺序表)

二、线性表 2.1线性表的定义和基本操作 2.1.1 线性表的基本概念 线性表:是具有相同数据类型的 n 个数据元素的有限序列。(Eg:所有的整数按递增次序排列,不是顺序表,因为所有的整数是无限的)其中n为表长,当n0时线性表是一个空表…

Java反射、枚举类和lambda表达式

前言: 本章我们就来了解Java中的反射和枚举类。枚举类和反射其实有些关系,接下来我们就来学习他们的使用。 反射: 反射的作用: 反射:反射允许对成员变量,成员方法和构造方法的信息进行编程访问。 Java中有…

input中文输入法导致的高频事件

这是基本结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>中文输入法的高频事件</title&…

F1 使用问题总结

F1 使用问题总结 问题一&#xff1a;话题发布 问题二&#xff1a;网络问题 文章目录 F1 使用问题总结一&#xff1a;话题发布一&#xff1a;rostopic命令将ROS话题的输出内容记录下来一&#xff1a;ROS分布式远程控制网络配置分布式介绍应用场景主从机配置环境搭建计算机虚拟机…

django学习记录07——订单案例(复选框+ajax请求)

1.订单的数据表 1.1 数据表结构 1.2 数据表的创建 models.py class Order(models.Model):"""订单号"""oid models.CharField(max_length64, verbose_name"订单号")title models.CharField(max_length64, verbose_name"名称&…

【前端】vscode快捷键和实用Api整理

vscode的快捷键 创建a.html 生成模板 !回车 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

Galxe:被低估的加密市场掘金地+Web3门户

在BTC ETF获得 SEC 的批准之后&#xff0c;机构资金大量买入推动BTC上涨&#xff0c;并带动整个加密市场回暖进入牛市。那么&#xff0c;对于习惯了熊市保守心态的投资者来说&#xff0c;接下来如何转换策略适应牛市&#xff1f;对即将进场的Web2用户来说&#xff0c;如何玩赚W…

《汇编语言》第3版 (王爽)实验11解析

第11章 实验11解析 检测点11.3 &#xff08;1&#xff09;.补全下面的程序&#xff0c;统计F000&#xff1a;0处32个字节中&#xff0c;大小在[32&#xff0c;128]的数据个数。 mov ax,0f000hmov ds,axmov bx,0mov dx,0mov cx,32s:mov al,[bx]cmp al,32jb s0 ;由于包含32&#…

深入理解Java泛型:灵活、安全、可重用的编程利器

Java泛型是一项强大的编程特性&#xff0c;为程序员提供了一种灵活、类型安全、可重用的编码方式。通过泛型&#xff0c;我们能够编写更加通用、适应多种数据类型的代码&#xff0c;从而提高了代码的灵活性和可维护性。在这篇博客中&#xff0c;我们将深入探讨Java泛型的各个方…

selenium元素定位问题

具体网页信息如下&#xff1a; 定位的时候driver.find_element(By.CLASS_NAME, 方法搞不定。 定位方法&#xff1a; 方法一&#xff1a;通过文本定位 driver.find_element(By.XPATH, "//*[text()高分一号]").click() time.sleep(3) 如果是部分文字 #部分文字py…

GFP-GAN环境搭建推理测试

引子 近期&#xff0c;文生图&#xff0c;wav2lip很火&#xff0c;文生图&#xff0c;见识的太多&#xff0c;不多说了。wav2lip其通过语音驱动唇部动作并对视频质量进行修复&#xff0c;里面一般涉及到三个步骤&#xff0c;文本到语音转化&#xff0c;语音驱动唇部动作&#…

HIVE伪分布安装

引言 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,类似于RDBMS(关系型数据库,如MySQL、Oracle、PgSQL),并提供类SQL的查询功能。 实验准备 1.搭建好伪分布安装模式的Hadoop的虚拟机,并配置了Linux网络。(可看我前面发布的文章) 2.apache…

美国签证|附面签相关事项√

小伙伴最近都忙着办签证吧&#xff01;但是需要注意的是&#xff0c;美国的签证跟其他任何国家的签证不同&#xff0c;并不是办理了就一定拿得到&#xff0c;据说概率是50%左右。所以办理美国签证&#xff0c;不要太着急啦&#xff01;先来了解一下美国签证的相片该怎么拍叭 ✅…

NPP VIIRS卫星数据介绍及获取

VIIRS&#xff08;Visible infrared Imaging Radiometer&#xff09;可见光红外成像辐射仪。扫描式成像辐射仪&#xff0c;可收集陆地、大气、冰层和海洋在可见光和红外波段的辐射图像。它是高分辨率辐射仪AVHRR和地球观测系列中分辨率成像光谱仪MODIS系列的拓展和改进。VIIRS数…

雷卯推荐电磁兼容保护器件-PPTC自恢复保险丝

一、PPTC的简介 自恢复保险丝, 简称PPTC。是一种正温度系数聚合物热敏电阻&#xff0c;作过流保护用&#xff0c;可代替电流保险丝。 电路正常工作时它的阻值很小&#xff08;压降很小&#xff09;&#xff0c;当电路出现过流使它温度升高时&#xff0c;阻值急剧增大几个数量级…

运行时错误‘53’:文件未找到:MathPage.WLL。Word粘贴复制时报错解决方案!

最近写文章使用 Word 时&#xff0c;粘贴复制总是出现这个报错&#xff0c;不能 ctrlc 和 v 好叫人苦恼。百度大致检索了一些过程&#xff0c;仍然有必要记录自己的问题解决过程。 快让本文进你的文件夹吃灰吧~ 报错如下&#xff1a; 运行时错误‘53’&#xff1a; 文件未找…

C++特殊类设计【特殊类 || 单例对象 || 饿汉模式 || 懒汉模式】

目录 1. 只在堆上创建的类 2. 只允许在栈上创建的类 3. 不能被继承的类 4. 不能被拷贝的类 5. 设计一个类&#xff0c;只能创建一个对象&#xff08;单例对象&#xff09; 饿汉模式 懒汉模式 嗨&#xff01;收到一张超美的风景图&#xff0c;愿你每天都能顺心&#xff0…

Java中常用的集合及方法(2)

在Java&#xff08;JDK8&#xff09;中&#xff0c;集合&#xff08;Collection&#xff09;是数据结构的实现&#xff0c;用于存储和操作对象集合。 集合&#xff08;Collection&#xff09;中包含的一般类或接口&#xff1a; 在这其中呢&#xff0c;我们经常使用的其实就是L…

实验一:华为VRP系统的基本操作

1.1实验介绍 1.1.1关于本实验 本实验通过配置华为设备&#xff0c;了解并熟悉华为VRP系统的基本操作 1.1.2实验目的 理解命令行视图的含义以及进入离开命令行视图的方法 掌握一些常见的命令 掌握命令行在线帮助的方法 掌握如何撤销命令 掌握如何使用命令快捷键 1.1.3实验组网 …