Python深浅拷贝

0、前置知识

数据类型:可变类型、不可变类型

不可变类型:一旦创建就不可修改的对象,包括字符串、元组、数值类型(整型、浮点型)

该对象所指向的内存中的值不能被改变。

当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。

可变类型:可以修改的对象,包括列表、字典、集合

该对象所指向的内存中的值可以被改变。

变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的地址,通俗点说就是原地改变。

一、可变类型:深浅拷贝

1.1 可变类型,浅拷贝

可变类型 浅拷贝:只拷贝外层对象,内层对象还是原内容的引用!

# 浅拷贝:只拷贝外层对象,内层对象还是原内容的引用!import copy
# 1. 定义一个嵌套列表
list1 = [1,2,3,[4,5]]# 2. 浅拷贝 => 切片也是浅拷贝的一种
list2 = copy.copy(list1)
print(id(list1), '可变类型浅拷贝:外层地址不同')
print(id(list2), '可变类型浅拷贝:外层地址不同')
print(id(list1[3]), '可变类型浅拷贝:内层地址相同')
print(id(list2[3]), '可变类型浅拷贝:内层地址相同')# 3. 浅拷贝带来的影响:如果内层对象发生改变,则两个对象都会受到影响
list2[3][0] = 8
print(list1)
print(list2)

运行结果如下:
在这里插入图片描述

1.2 可变类型,深拷贝

可变类型 深拷贝:创建一个新对象,新对象与原对象完全不同,修改新对象不会影响原对象。
不仅拷贝了外层对象,也拷贝内层对象。

# 1.导包
import copy
# 2.定义一个列表嵌套
list1 = [1,2,3,[4,5]]
list2 = copy.deepcopy(list1)# 3.外层对象已被拷贝
print(id(list1), '可变类型深拷贝:外层地址不同')
print(id(list2), '可变类型深拷贝:外层地址不同')# 4.内层对象也被拷贝
print(id(list1[3]), '可变类型深拷贝:内层地址不同')
print(id(list2[3]), '可变类型深拷贝:内层地址不同')# 5.修改新对象
list2[3][0] = 6
print(list1)
print(list2)

运行结果如下:
在这里插入图片描述
总结:
可变类型拷贝时:
浅拷贝:外层对象被拷贝,内层对象还是原来对象的引用(外层地址改变,内层地址不变)。
深拷贝:外层对象和内层对象都被拷贝,都开辟了新的内存地址(外层地址和内层地址都改变)。

二、不可变类型:深浅拷贝

2.1 不可变类型,浅拷贝

不可变类型 浅拷贝:不会开辟新内存空间,新对象拷贝内容相当于原内容的引用。

import copy
# 1. 定义一个元组嵌套结构
tuple1 = (1, 2, 3, (4, 5))
# 2. 浅拷贝
tuple2 = copy.copy(tuple1)print(id(tuple1), '不可变类型浅拷贝:外层地址相同')
print(id(tuple2), '不可变类型浅拷贝:外层地址相同')print(id(tuple1[3]), '不可变类型浅拷贝:内层地址相同')
print(id(tuple2[3]), '不可变类型浅拷贝:内层地址相同')

运行结果如下:
在这里插入图片描述

2.1 不可变类型,深拷贝

不会开辟新内存空间,新对象拷贝内容相当于原内容的引用。

import copy
# 1. 定义一个元组嵌套结构
tuple1 = (1, 2, 3, (4, 5))
# 2. 深拷贝
tuple2 = copy.deepcopy(tuple1)print(id(tuple1), '不可变类型深拷贝:外层地址相同')
print(id(tuple2), '不可变类型深拷贝:外层地址相同')print(id(tuple1[3]), '不可变类型深拷贝:内层地址相同')
print(id(tuple2[3]), '不可变类型深拷贝:内层地址相同')

运行结果如下:
在这里插入图片描述

总结:
不可变类型拷贝时:
无论是深拷贝还是浅拷贝,都不会开辟新的内存空间,新拷贝的对象(无论是外层对象还是内层对象)都引用了原来对象的地址,内外层地址都不发生改变!

以上两大种情况,内外层对象的类型都保持一致,意思就是:
1.1和1.2 :外层对象是可变类型,内层对象也是可变类型(例子中内、外层对象都是列表类型)
2.1和2.2:外层对象是不可变类型,内层对象也是不可变类型(例子中内、外层对象都是元组类型)
那么,下面来为你介绍特殊情况,就是外层对象和内层对象的类型不一致的情况

三、特殊情况

3.1 特殊情况1:外层是不可变类型,内层是可变类型

3.1.1 特殊情况1:外层不可变类型,内层可变类型 浅拷贝

外层是不可变,内层是可变类型
浅拷贝:不会开辟新内存空间,新对象只是复制原内容引用。外层对象和内层对象地址相同。

import copy
# 外层是元组,不可变类型
# 内层是列表,可变类型
tuple1 = (1,2,3,[4,5])# 特殊情况1:(外层不可变类型,内层可变类型)浅拷贝
tuple2 = copy.copy(tuple1)
print(id(tuple1), '特殊情况1(外层不可变类型,内层可变类型)浅拷贝:外层地址相同')
print(id(tuple2), '特殊情况1(外层不可变类型,内层可变类型)浅拷贝:外层地址相同')
print(id(tuple1[3]), '特殊情况1(外层不可变类型,内层可变类型)浅拷贝:内层地址相同')
print(id(tuple2[3]), '特殊情况1(外层不可变类型,内层可变类型)浅拷贝:内层地址相同')

运行结果:
![

3.1.2 特殊情况1:外层不可变类型,内层可变类型 深拷贝

外层是不可变,内层是可变类型
深拷贝:创建一个新对象,新对象与原对象完全独立。外层对象和内层对象都不同。

import copy
# 外层是元组,不可变类型
# 内层是列表,可变类型
tuple1 = (1,2,3,[4,5])# 特殊情况1:(外层不可变类型,内层可变类型)深拷贝
tuple2 = copy.deepcopy(tuple1)
print(id(tuple1), '特殊情况1(外层不可变类型,内层可变类型)深拷贝:外层地址不同')
print(id(tuple2), '特殊情况1(外层不可变类型,内层可变类型)深拷贝:外层地址不同')
print(id(tuple1[3]), '特殊情况1(外层不可变类型,内层可变类型)深拷贝:内层地址不同')
print(id(tuple2[3]), '特殊情况1(外层不可变类型,内层可变类型)深拷贝:内层地址不同')

运行结果:
在这里插入图片描述
小结:
外层是不可变类型,内层是可变类型
浅拷贝:不会开辟新内存空间,新对象只是复制原内容引用。内外层地址都相同。
深拷贝:创建一个新对象,新对象与原对象完全独立。内外层地址都不同。

3.2 特殊情况2: 外层是可变类型,内层是不可变类型

3.2.1 特殊情况2:外层是可变类型,内层是不可变类型 浅拷贝

import copy# 外层是列表,可变类型
# 内层是元组,不可变类型
list1 = [1, 2, 3, (4, 5)]# 特殊情况2:(外层是可变类型,内层是不可变类型)浅拷贝
list2 = copy.copy(list1)
print(id(list1), '特殊情况2(外层是可变类型,内层是不可变类型)浅拷贝:外层地址不同')
print(id(list2), '特殊情况2(外层是可变类型,内层是不可变类型)浅拷贝:外层地址不同')
print(id(list1[3]), '特殊情况2(外层是可变类型,内层是不可变类型)浅拷贝:内层地址相同')
print(id(list2[3]), '特殊情况2(外层是可变类型,内层是不可变类型)浅拷贝:内层地址相同')

运行结果:
在这里插入图片描述

3.2.2 特殊情况2:外层是可变类型,内层是不可变类型 深拷贝

import copy# 外层是列表,可变类型
# 内层是元组,不可变类型
list1 = [1, 2, 3, (4, 5)]# 特殊情况2:(外层是可变类型,内层是不可变类型)浅拷贝
list2 = copy.deepcopy(list1)
print(id(list1), '特殊情况2(外层是可变类型,内层是不可变类型)深拷贝:外层地址不同')
print(id(list2), '特殊情况2(外层是可变类型,内层是不可变类型)深拷贝:外层地址不同')
print(id(list1[3]), '特殊情况2(外层是可变类型,内层是不可变类型)深拷贝:内层地址相同')
print(id(list2[3]), '特殊情况2(外层是可变类型,内层是不可变类型)深拷贝:内层地址相同')

运行结果:
在这里插入图片描述
总结:
特殊情况2:外层是可变类型,内层是不可变类型
浅拷贝:外层对象被拷贝,内层对象还是原来对象的引用(外层地址改变,内层地址不变)。
深拷贝:外层对象和内层对象都被拷贝,都开辟了新的内存地址(外层地址和内层地址都改变)。
类似于可变类型的深浅拷贝。

============================

日拱一卒,功不唐捐,信奉长期主义

每天进步一点点,为中国人工智能的发展贡献力量!

我这么可爱,还等什么?快点关注我哦~

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

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

相关文章

【MySQL 12】事务管理 (带思维导图)

文章目录 🌈 一、事务的基本概念⭐ 1. 事务是什么⭐ 2. 事务的特性 🌈 二、事务的版本支持🌈 三、事务的提交方式⭐ 1. 查看事务的提交方式⭐ 2. 设置事务的提交方式 🌈 四、事务的特性证明⭐ 1. 事务的常规操作⭐ 2. 证明事务的原…

进程间的通信

建立两个.c 建立子父进程&#xff0c;父进程发送消息到队列&#xff0c;子进程读取队列&#xff0c;另一个同样。 #include <myhead.h> struct msga {long mtype;char mtext[1024]; }; #define len sizeof(struct msga)-sizeof(long) int main(int argc, const char *arg…

烂大街的测试左移和右移

01 测试左移与右移的定义 通俗的讲&#xff1a;左移是往开发阶段移&#xff0c;右移是往发布之后移。 正常测试&#xff1a;提测后的测试工作——到——发布验证完成阶段。 测试左移&#xff1a;提测之前的测试。 如&#xff1a;代码单元测试&#xff0c;代码质量检测&#x…

python-读取word中的内容

doc Document(rD:\xxxx\xxxx\xxx.docx) #读取word中所有内容 for p in doc.paragraphs print(p,p.text) #读取指定段落中的所有run(文字块) for run in doc.paragraphs[1].runs: print(run,run.text) #读取word中所有表格内容 for 表格 in doc.tables: print(表格) for 行 in …

产品经理有没有必要考pmp证书?

可以给一个总结&#xff1a;想提升自己的可以考&#xff0c;单纯奔着考证去的&#xff0c;没必要考&#xff01; 如果产品经理的相关证件&#xff0c;比如 npdp 之类的&#xff0c;都已经拿到手了&#xff0c;并且觉得自己现阶段工作比较满意&#xff0c;想提升自己更上一层楼…

《安全回收电脑,从销毁硬盘数据开始》文件硬盘数据销毁

在这个信息高速发展的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;当我们决定更换电脑或者对旧电脑进行回收时&#xff0c;你是否考虑过硬盘中存储的数据安全问题呢&#xff1f; 电脑硬盘中可能存储着大量的个人信息、工作文件、照片、视频等…

解决vue中this.$set()不更新页面问题

问题汇总&#xff1a;解决vue中this.$set()不更新页面问题 this.$set()方法有一种情况&#xff0c;就是当你要设置的key已经存在于这个对象或数组中的时候&#xff0c;它只会更改data并不会为该key添加响应检测&#xff0c;所以解决这个问题的办法就是在设置值之前先把这个属性…

k8s项目的发布(金丝雀发布)

目录 三种发布方式 1.蓝绿发布 2.金丝雀发布&#xff08;灰度发布&#xff09; 实验&#xff1a;k8s实现金丝雀发布 3.滚动发布&#xff08;默认形式&#xff09; 因为应用升级以及新旧业务切换&#xff0c;所以在这个过程当中如何保证对外的服务正常是一个非常重要的问题…

InternVL 多模态模型部署微调实践

写在前面&#xff08;什么是InternVL&#xff09; InternVL 是一种用于多模态任务的深度学习模型&#xff0c;旨在处理和理解多种类型的数据输入&#xff0c;如图像和文本。它结合了视觉和语言模型&#xff0c;能够执行复杂的跨模态任务&#xff0c;比如图文匹配、图像描述生成…

macos 10.15 catalina xcode 下载和安装

在macos 10.15 catalina系统中, 由于系统已经不再支持,所以我们无法通过应用商店来安装xcode, 需要手动下载指定版本的 xcode 版本才能安装, catalina 支持的最新xcode版本为 Xcode v12.4 (12D4e) , 其他的新版本是无法安装在Catalina系统中的. Xcode_12.4.xip下载地址 注意,下…

前端开发学习Docker记录02容器操作

docker images先查看有哪些镜像 运行nginx docker run nginx使用docker ps 可以看到有哪些镜像在运行 docker stats查看运行状态 命令总结

linux 云主机下载压缩包安装配置 maven 实录(华为云 EulerOS)

本想通过 yum install maven 直接安装的, 方便省事, 但报错说没找到, 于是只能手动安装了, 把整个过程记录了一下, 包括下载, 解压, 配置及验证的全过程, 并对用到的命令及参数作了详细说明, 需要的同学可以参考. maven 官网找到下载链接 首先要去到 maven 的官网, https://m…

国产网卡品牌崛起,做好网络信息安全的“守门人”

在信息技术日新月异的时代背景下&#xff0c;信息安全不仅关乎个人隐私保护&#xff0c;更是国家安全与经济发展的基石。LR-LINK联瑞凭借其前瞻性的视野和深厚的研发实力&#xff0c;成功自主研发出全国产化的FPGA&#xff08;现场可编程门阵列&#xff09;网闸隔离卡方案&…

AI编码公司Magic获得近5亿美元巨额投资

Magic&#xff0c;一家专注于生成式人工智能AI编码的初创公司&#xff0c;最近在AI领域取得了显著的成就。该公司通过创建模型来生成代码并自动执行软件开发任务&#xff0c;成功吸引了包括前谷歌CEO埃里克施密特在内的一系列知名投资者的关注&#xff0c;并完成了一轮3.2亿美元…

Linux 下查找运行中的 Java 进程及 .jar 文件位置

在 Linux 环境中&#xff0c;有时我们需要查找正在运行的 Java 进程以及它们对应的 .jar 文件位置。本文将介绍如何使用命令行工具来实现这一目标。 前言 在 Linux 系统中&#xff0c;我们经常需要监控正在运行的应用程序&#xff0c;特别是在出现问题时&#xff0c;了解应用程…

Hook 框架 Frida

文章目录 Hook 框架 FridaHook框架介绍下载和安装Frida 的使用手机端启动frida服务端电脑端配置简单使用python的hook方式js的hook方式 Hook 框架 Frida Hook框架介绍 Hook 框架是一种技术&#xff0c;用于在运行时拦截和修改应用程序的行为。 通过 Hook&#xff0c;你可以劫…

鸿蒙界面开发(八):Grid网格布局Badge角标组件

Badge角标组件 在目标组件的外层包裹一层Badge角标组件 支持位置&#xff1a;右上&#xff0c;左&#xff0c;右 也可以使用绝对定位实现更灵活的角标位置。 Badge({count:1,//角标数值&#xff0c;角标数值为0时不展示position:BadgePosition.RightTop,//角标位置&#xff0…

换毛季猫咪化身掉毛怪,宠物浮毛如何清理?推荐用宠物空气净化器

我家现在有三只毛孩子&#xff0c;养宠的幸福是三倍&#xff0c;除毛的烦恼也是三倍。尤其还有两只是银渐层&#xff0c;掉毛量实在是太夸张了&#xff0c;衣服、地板、水杯家里到处都是。我也每天早晚都给它们梳毛&#xff0c;卫生也定期清理&#xff0c;可还是浮毛满天飞。 …

kafka集群

cd /opt/software 把kafka压缩包拉进来 并解压到/usr下 tar -xzvf /opt/software/kafka_2.12-2.7.0.tgz -C /usr/ 改名 mv /usr/kafka_2.12-2.7.0/ /usr/kafka 配置环境变量 vim /etc/profile大写G定位到最后一行 在 o 在下一行添加kefka环境变量export JAVA_HOME/usr…

店招起名“大润發”,侵犯“大润发”商标权赔偿8000元!

近日某干果店招为“大润發水果干果批发”的店铺&#xff0c;因侵犯“大润发”注册商标专用权&#xff0c;赔偿原告所属主体共计人民币8000元&#xff0c;有些人起店招名称喜欢傍大牌&#xff0c;这样很容易侵犯商标权。 有些聪明的人会想&#xff0c;大牌商标是繁体&#xff0c…