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

copy

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

一、’ ==’ & ‘is’

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

  • a == b

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

a = 10
b = 10a == 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.mzph.cn/news/218640.shtml

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

相关文章

Linux系统解决“Key was rejected by service”

Linux系统下加载驱动模块出现如上错误提示的原因为:此驱动未经过签名。 方法一、关闭Secure Boot 如果是物理机,需要开机进入BIOS,找到“Secure Boot”的选项,然后关闭。 如果是虚拟机,可以打开虚拟设置&#xff0c…

快速准确翻译文件夹名:英文翻译成中文,文件夹批量重命名的技巧

在处理大量文件夹时,可能会遇到要将英文文件夹名翻译成中文的情况。同时也可能要批量重命名这些文件夹。今天一起来看下云炫文件管理器如何快速准确翻译文件夹名,进行批量重命名的技巧。 下图是文件夹名翻译前后的效果图。 英文文件夹名批量翻译成中文…

3Dmax快捷键大全,让你的创作飞起来!附赠3dmax工具箱插件,快来收藏吧!

你是否曾经在3Dmax中因为繁琐的操作而感到困扰? 今天,我将为大家带来一份精心整理的3Dmax常用快捷键宝典,让你在建模、材质编辑、动画制作等各个方面都能游刃有余,让你的创作飞起来!! 💡 选择与…

27. 深度学习进阶 - 为什么RNN

文章目录 一个柯基的例子为什么RNN or CNN Hi,你好。我是茶桁。 这节课开始,我们将会讲一个比较重要的一种神经网络,它对应了咱们整个生活中很多类型的一种问题结构,它就是咱们的RNN网络。 咱们首先回忆一下,上节课咱…

【计算机网络】TCP|IP协议

目录 前言 什么是TCP/IP协议? TCP/IP协议的层次结构 TCP/IP协议的工作原理 TCP/IP协议的重要性 结语 前言 TCP/IP协议是当今互联网世界中最重要的网络协议之一,它是网络通信的基石,为数据在网络中的传输提供了可靠性和有效性。本文将深…

python编程需要的电脑配置,python编程用什么电脑

大家好,小编来为大家解答以下问题,python编程对笔记本电脑配置的要求,python编程对电脑配置的要求有哪些,现在让我们一起来看看吧! 学习python编程需要什么配置的电脑 简单的来讲,Python的话普通电脑就可以…

SAP UI5 walkthrough step1 hello word

这里我用的VS Studio 来进行本地化学习 关于SAP UI5是啥,我就不再赘述了,另外还有VS Studio 的安装,请提前做好准备 下面我们直接进入正文 1.首先在你的本地新建一个文件夹,此处我命名为:walkthrough 2.在VS中打开…

【数据结构与算法】JavaScript实现图结构

文章目录 一、图论1.1.图的简介1.2.图的表示邻接矩阵邻接表 二、封装图结构2.1.添加字典类和队列类2.2.创建图类2.3.添加顶点与边2.4.转换为字符串输出2.5.图的遍历广度优先搜索深度优先搜索 2.6.完整实现 一、图论 1.1.图的简介 什么是图? 图结构是一种与树结构…

Java中的反射

反射 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机, Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. 反射相关的概念 2. 反射的…

HarmonyOS4.0从零开始的开发教程12给您的应用添加弹窗

HarmonyOS(十)给您的应用添加弹窗 概述 在我们日常使用应用的时候,可能会进行一些敏感的操作,比如删除联系人,这时候我们给应用添加弹窗来提示用户是否需要执行该操作,如下图所示: 弹窗是一种…

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

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

Python脚本打包

一.Windows操作系统 Python脚本打包 1.cmd窗口执行如下指令:pip install pyinstaller C:\Users\ZhuQing>pip install pyinstaller2.执行以下指令验证pyinstaller是否安装成功(pyinstaller) C:\Users\ZhuQing>pyinstaller3.被打包程序…

frp配置内网穿透步骤

frp配置内网穿透步骤 1.环境准备1.1 云服务器1.2 frp包 2. frp安装2.1 server服务端设置2.2 客户端配置 实现目标通过云服务器ip:8080访问内网电脑启动的web项目localhost:8080 1.环境准备 1.1 云服务器 服务器安装centos7.9, 安全组入口方向开通 7500 7000 8080 8060端口 …

DPDK是什么?DPDK网卡更有优势吗?

近年来,随着数字化的推进,上云成为企业数字化建设的重要指标,用云程度持续深入。可以说,云时代已经来临。 应云而生的DPDK 云时代的一个典型特征,是数据的高速增长。据华为GIV数据,预计2025年全球数据量将…

【力扣】2.两数相加

2.两数相加 这是第二题,还行豁~。 题解: 首先就是对题目的理解。这里你要知道两链表中数字的排列都是逆序的,也就是说示例一中2-4-3他原本的数字应该是342。同理可得下面链表的意思,二者相加所得到的结果也是逆序的,…

基于Java8构建Docke镜像

基于Java8构建Docke镜像 搜索java8安装包 docker search java8 --no-trunc , --no-trunc展开描述信息 选择拉取 docker pull docker.io/mykro/java8-jre,为了减少磁盘占用,选择jre版本基础镜像 在宿主机创建文件夹iot,并把所需…

python笔记(1)安装环境

1,官网下载自己电脑位数的安装包 https://www.python.org/downloads/windows/ install时勾选中add to path,把路径自动添加到环境变量 安装pycharm就不讲了 安装后选中自己的python安装包 file-> setting->project:yourprojectname ->pyt…

FastAPI之请求头

请求头 FastAPI是一个现代、快速(高性能)、异步的Python Web框架,用于构建RESTful APIs。它基于标准的Python类型提示,并且可以生成交互式的API文档。 在本教程中,我们将学习如何使用FastAPI处理请求头(H…

【详解优先级队列(堆)】

目录 堆的概念 堆的性质 堆的存储方式 堆的创建 堆的向下调整 向下过程(以小堆为例) 向下过程(以大堆为例) 建堆的时间复杂度O(n) 堆的插入与删除 堆的插入 向上调整建堆的时间复杂度O(nlogn) 堆的删除 常见习题 常用接口介绍 PriorityQueue的特性 Pri…

成功的云转型之路需要考虑的基本因素

云计算如今已经变得无处不在,并显著影响着日常生活的各个方面。然而,重要的是要注意云计算技术是不断发展的。最近向远程工作的转变促使企业加快数字化转型,更多地采用云计算服务。 即使在新冠疫情消退之后,云计算技术的采用也获得…