python学习:浅拷贝与深拷贝详解

news2024/11/22 8:58:45

copy

  • 一、' ==' & 'is'
  • 二、浅拷贝 & 深拷贝
    • (一)、浅拷贝
    • (二)、深拷贝
  • 三、问题

一、’ ==’ & ‘is’

’ =='和is是python对象比较常用的两种方式,简单来说,‘ ==‘操作符比较对象之间的值是否相等,如

  • a == b

而’is’操作符比较的是对象的身份标识是否相等,即它们是否是同一个对象,是否指向同一个内存地址,在python中,每个对象的身份标识,都能通过id(object)获得,因此’is’操作符,相当于比较对象之间的id是否相等

a = 10
b = 10

a == b返回的是True
a is b相当于id(a) == id(b)返回的也是True
  • 上述代码,首先python会为10这个值开辟一块内存,然后变量a和b同时指向这块内存区域,即a和b都是指向10这个变量,因此a和b的值相等,id也相等,a == b和 a is b都返回True

不过,需要注意,对于整型数字来说,a is b为True的结论,只适用于-5到256范围内的数字

a = 257
b = 257

这时候,id(a) != id(b),即a is b返回的是False

  • 出于性能优化的考虑,python内部会对-5到256的整型维持一个数组,起到一个缓存的作用,这样,每次试图创建一个-5到256范围内的整型数字时,python都会从这个数组中返回相对应的引用,而不是重新开辟一块新的内存空间;
  • 若超过这个范围,就会开辟两块内存区域,因此指向的内存地址不一样

性能:

  • 操作符’is’的速度效率,通常要由于’==‘,因为is不允许被重载,只需要比较id(val1) 是否等于 id(val2),但是’ ==’操作符不同,python大部分的数据类型都会去重载’ ==‘,对于列表,’ ==',会遍历列表中的元素,比较它们的值和顺序是否相等

二、浅拷贝 & 深拷贝

(一)、浅拷贝

1、实现方式

  • 数据类型本身的构造器
l1 = [1,2,3,4]
l2 = list(l1)

d1 = {1: 'a',2: 'b'}
d2 = dict(d1)
  • 切片
l1 = [1,2,3,4]
l2 = l1[:]
  • copy函数
import copy
l1 = [1,2,3,4]
l2 = copy.copy(l1)

2、实现原理

  • 浅拷贝,是指重新分配一块内存,创建一个新的对象,里面的元素若是嵌套元素,拷贝的只是嵌套元素对象的引用

怎么理解呢?,假如有下述列表

l1 = [1,2,3,[4,5]]
l2 = l1[:]

相当于l2会重新开辟一块内存区域,会存储1,2,3,但是不会存储[4,5],只是存储[4,5]对象的引用,如下图所示

在这里插入图片描述

可以用代码试一下

l1[0] = 'a'
print(l2) 
  • 发现l2中的元素没有发生变化,是因为l1[0]是被拷贝到l2新开辟到的内存区域,修改l1[0]对l2[0]并没有影响
l1[-1].append(6)
print(l2)
  • 发现l2[-1]也发生了变化,是因为l1[-1]和l2[-1]都是指向同一个内存区域,都是同一个对象的引用

因此浅拷贝也可以简单理解,相当于只拷贝第一层的元素,嵌套元素不进行拷贝

(二)、深拷贝

1、实现方式

  • copy函数
l1 = [1,2,3,4]
l2 = copy.deepcopy(l1)

2、实现原理

  • 深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中

如下图所示:
在这里插入图片描述

import copy
l1 = [1,2,3,[4,5]]
l2 = copy.deepcopy(l1)

此时修改列表l1

l1[-1].append(6)
print(l2)
  • 发现l2的元素并没有改变,这样看来,深拷贝才是我们平常意义上理解的拷贝,原对象的修改跟现对象没有一点关系

三、问题

1、对于不可变数据类型,使用浅拷贝和深拷贝的结果是一样的吗?
我们知道,对于不可变数据类型,没有提供修改它的方法,是不是可以理解为无论是浅拷贝还是深拷贝返回的结果都是一样的

  • 答案是不一样
  • 虽然是不可变数据类型,但是里面也可能存储可变的数据类型,比如元组中存储列表
import copy
s1 = (1,2,[3,4])
s2 = copy.copy(s1)
s3 = copy.deepcopy(s2)
s1[-1].append(5)
print(s1)
print(s2)
print(s3)
print(s1 is s2) #True
  • 发现s3是没变的,这个很好理解,深拷贝就是不应该变化的
    发现s1和s2是变化的,这个是因为列表是可变的,但是对于不可变数据结构,浅拷贝并没有新建一段内存区域,而是指向原对象的引用

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

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

相关文章

HNU数据库大作业-世界杯比赛系统

前言 之前做的那个版本bug较多,后进行了大量优化。 此项目是一个前后端分离的项目,前端主要使用htmlcssjs搭建,使用的是layui框架 后端使用php语言,仅实现了简单的查询数据库功能,无法实现多并发查询等复杂情况 数…

jetpack compose 学习(-)

年底了,无聊的时间总是缓慢的,找个事情做一做,打发打发时间,刚好看到jetpack compose 学习学习,毕竟androidStudio 默认创建的项目都带上了这个,学习网站:https://developer.android.com/jetpack/compose/modifiers?hlzh-cn 1. 首先androidStudio创建一个新项目 喜欢kotlin的,…

亚马逊、速卖通自养号测评的安全稳定性与成本优势分析

在跨境电商平台的运营中,买家评价的重要性不言而喻。很多买家在购买产品前都会查看评论,比较同类产品的买家口碑,以做出更明智的购买决策。 因此,测评一直是各大跨境电商平台的一种重要推广方式,测评同时也是很多卖家…

BugKu-Web-Simple_SSTI_1Simple_SSTI_2(浅析SSTI模板注入!)

何为SSTI模块注入? SSTI即服务器端模板注入(Server-Side Template Injection),是一种注入漏洞。 服务端接收了用户的恶意输入以后,未经任何处理就将其作为Web应用模板内容的一部分,模板引擎在进行目标编译渲…

TCP/IP详解——网络基本概念

文章目录 一、网络基本概念1. OSI 7层模型1.1 每层对应的协议1.2 每层涉及的设备1.2.1 物理层设备1.2.2 数据链路层设备1.2.3 网络层设备1.2.4 传输层设备1.2.5 交换机和路由器的应用1.2.6 问题 2. TCP/IP 4层模型3. 物理层传输介质3.1 冲突域 4. 数据链路层4.1 以太网帧结构4.…

socket 套接字

1、套接字介绍 socket起源于Unix,遵循“一切皆文件”出发点,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。 在设计模式中,Socket把复杂的TCP/IP协议族隐藏在Socket接口后面,Socket去组织数据&#xf…

Godot导出Android包报错:无效的包名称

问题描述 使用Godot为项目导出Android平台包时报错,提示:“无效的包名称:项目名称不符合包名格式的要求。请显式指定包名。” 解决办法 修改导出配置项“包->唯一名称”。 该项缺省值“org.godotengine.$genname”不能直接使用&#x…

36V/48V转12V 10A直流降压DC-DC芯片-AH1007

AH1007是一款36V/48V转12V 10A直流降压(DC-DC)芯片,它是一种高性能的降压变换器,常用于工业、汽车和电子设备等领域。 AH1007采用了先进的PWM调制技术和开关电源控制算法,能够高效地将输入电压从36V/48V降低到12V&…

SSM整合——Springboot

1.0 概述 1.1 持久层: DAO层(mapper) DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此 DAO层的设计首先是设计DAO的接口, 然后在spring-mapper.xml的配置文件中定义此接…

【Unity学习笔记】光照简介

本节主要是简单介绍一些常见的光照组件和渲染设置。 文章目录 灯光类型平行光Directional Light点光源Point Light聚光灯Spot Light面积光 Area Light 阴影设置全局光照明光照模式直接光照与间接光照Mixed Lighting 光照探针Light Probe Group光照探针组 反射探针 灯光类型 在…

00后女孩月薪3200,3年买两套房,这个程序员变现新风口千万要把握住

00后女孩月薪3200,3年买两套房,这个程序员变现新风口千万要把握住 前几天,在网上看到了一份中国90后收入的调查报告: 报告显示: 90后月均收入8000元,三成90后零存款,两成90后存款达到10万以上…

鸿蒙开发之页面与组件生命周期

一、页面间的跳转 创建文件的时候记得选择创建page文件,这样就可以在main->resources->profile->main_pages.json中自动形成页面对应的路由了。如果创建的时候你选择了ArkTS文件,那么需要手动修改main_pages.json文件中,添加相应的…

mysql字段设计规范:使用unsigned(无符号的)存储非负值

如果一个字段存储的是数值,并且是非负数,要设置为unsigned(无符号的)。 例如: 备注:对于类型是 FLOAT、 DOUBLE和 DECIMAL的,UNSIGNED属性已经废弃了,可能在mysql的未来某个版本去…

​flutter 代码混淆

​flutter 代码混淆 Flutter 应用混淆:Flutter 应用的混淆非常简单,只需要在构建 release 版应用时结合使用 --obfuscate 和 --split-debug-info 这两个参数即可。–obfuscate --split-debug-info 用来指定输出调试文件的位置,该命令会生成一…

threejs 多屏互动效果,居然还能这么玩

threejs 多屏互动效果 看别人做了多屏互动的效果,觉得还挺有意思的,也顺便自己动手操作一下试试。 先来张效果图: 项目地址 参考地址 项目基于vuethreejs。 思路 大体思路如下: 架设一个正投影摄像机,在屏幕中间…

技术阅读周刊第9️⃣期

技术阅读周刊,每周更新。 历史更新 20231107:第五期20231117:第六期20231124:第七期20231201:第八期 美团技术博客十周年,感谢一路相伴 - 美团技术团队 URL: https://tech.meituan.com/2023/12/04/ten-year…

java学生选课系统 数据库版

首先让我们创建一个数据库 让我们向表中插入数据然后查询它

AI全栈大模型工程师(二十八)如何做好算法备案

互联网信息服务算法 什么情况下要备案? 对于B2B业务,不需要备案。 但在B2C领域,一切要视具体情况而定。 如果我们自主训练大型模型,这是必要的。 但如果是基于第三方模型提供的服务,建议选择那些已获得备案并且具有较大…

光伏开发设计施工一体化系统都有哪些功能?

随着全球对可再生能源的需求不断增加,光伏行业得到了快速发展。同时也面临着一些挑战,例如初始投资成本高、需要大量土地和水资源等。鹧鸪云光伏与储能软件利用技术创新,促进光伏行业数字化升级。 一、智能测算 1.投融资表:采用…

如何处理PHP开发中的单元测试和自动化测试?

如何处理PHP开发中的单元测试和自动化测试,需要具体代码示例 随着软件开发行业的日益发展,单元测试和自动化测试成为了开发者们重视的环节。PHP作为一种广泛应用于Web开发的脚本语言,单元测试和自动化测试同样也在PHP开发中扮演着重要的角色…