python学习笔记:引用、浅拷贝和深拷贝(底层原理)

news2024/9/20 22:56:32

前言

在python中“一切皆对象”,包括整数(int),小数(float)等

引用

Python解释器维护了一个内部的数据结构,称为命名空间或符号表,它将变量名与对象的内存地址关联起来。当您创建一个变量并将其赋值为某个对象时,实际上是将变量名与对象的内存地址关联起来,从而使变量可以引用该对象。

在python中,变量是一个标识符,解释器遇到这个标识符的时候,会在python的“符号表”里面对应它的位置,并返回它对应的对象的地址。在赋值操作时,符号表将会被编辑,标识符对应的对象地址被改变,使得变量可以引用新的对象。

比如:当我执行:

a = ‘hello’

b = 'world'

拓展:

python的不可变对象用的是引用计数机制。为了节省内存和提高效率,如果创建多个值相同的变量,他们指向的对象一般是相同的。比如

a = 1
b = a
c = b

执行完这段代码之后,a,b,c都指向同一个地址(同个对象),这个地址的引用次数为3。但是当我们改变其中一个变量的值(实际上是想要改变变量引用的对象的值)得时候,其他两个变量的值不会改变。这是为什么?这是因为int是不可变类型,所以实际上当你想要改变变量引用的对象的值的时候,不会真的改变这个对象的值,而是新建了一个对象,然后让变量引用这一个新的对象,相应地“1”的引用次数减少为2。

若执行:b = 2,不会改变0x11的值,而是在内存里新建一个值为2的对象:

(当地址的引用次数变为0,python会回收这块内存。)

浅拷贝

哪些操作属于:除了copy 模块中的 deepcopy 函数,其他均为浅拷贝

就是只拷贝一层的信息,不管是拷贝最外层的引用(直接赋值),还是次外层的引用(切片),只一层。

深拷贝

只有 copy 模块中的 deepcopy 函数能够实现

新建新的对象,递归重建完全一样的引用结构。

浅拷贝和深拷贝的区别

浅拷贝和深拷贝的区别不在深浅,而在对引用结构的拷贝是全面的还是部分的。

有时候浅拷贝操作的效果和深拷贝完全相同,比如

a = [1, 2, 3]
b = a[:]
a[0] = 4

print(b[0])

这时b[0]的值没有改变还是1,也就是b = a[:]等价于 b = copy.deepcopy(a)

这是因为切片虽然是浅拷贝,但是不是拷贝a数组这个对象的引用,而是a数组内容里面每个对象的引用,由于前文提到的int类型对象的不可变性,当我们尝试改变a[0]引用的整型对象的值得时候,会新建一个新对象,这个对象的值被改成4,这就和b没什么关系了。

所以我把切片赋值这样的浅拷贝称为“拷贝次外层”的浅拷贝。和我用循环通过下标赋值类似。

但当浅拷贝对象是可变对象时,浅拷贝和深拷贝的区别就显现出来了:

示例:

a = [1, 2, [3, 4]]
b = a[:]  # 切片操作
b[0] = 100  # 修改 b 的第一个元素
b[2][0] = 300  # 修改 b 的嵌套列表中的元素

print(a)  # 输出:[1, 2, [300, 4]]

在上述示例中,切片复制了包含整数的部分,因此修改 b[0] 不会影响 a,但它仍然共享嵌套列表中的引用,因此修改 b[2][0] 也会影响 a。这说明切片是浅拷贝的行为,只适用于最外层的元素。

总结一下,就是如果改变一个变量,另一个也跟着改变了,就是因为两个引用了相同的可变对象。

有什么问题,欢迎评论提出。

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

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

相关文章

【ArcGIS模型构建器】02:shp批量转kml/kmz

文章目录 一、加载实验数据二、设计模型构建器三、保存模型构建器 一、加载实验数据 打开ArcMap,加载专栏配套实验数据data02.rar中的,位于乡镇根目录文件夹内的15个乡镇矢量数据。 接下来跟我一步步实现用模型构建器批量转为kml。 二、设计模型构建器…

如何创建前端绘图和图表?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

外贸找客户软件:BotMaster 2023 Crack

具有多设备支持的全新 WhatsApp™ Business 批量发送器 最新9.0.2.1 稳定且工作。 测试日期:2023 年 10 月 9 日 所有功能工作正常。 图像发送问题固定 数字过滤器和组抓取器已修复。 目前稳定 现在使用 BotMaster 9.0.2.1 从 WhatsApp™ 发送交互式按钮 您现在可以…

设置host

macOS sudo nano /etc/hosts sudo nano /etc/hosts127.0.0.1 yourdomain.com 127.0.0.1 subdomain.yourdomain.com 将 yourdomain.com 替换为您要配置的域名,将 subdomain.yourdomain.com 替换为您要配置的子域名。确保 IP 地址为 127.0.0.1,这将指向…

C++对象模型(19)-- 函数语义学:成员函数

1、普通成员函数的调用 1.1 调用方式的转换 为了提高普通成员函数的调用效率,在C中,对普通成员函数的调用,会转换成对全局函数的调用。 假如有下面所示的成员函数: class Test { public:int m_i;int func(int a) {m_i a;retu…

划片机:半导体芯片是如何封装的?

半导体芯片的封装是指将芯片内部的电路通过引脚、导线、焊盘等连接起来,并保护芯片免受外部环境的影响,同时满足外部电路的连接需求。以下是半导体芯片封装的常见步骤: 1. 减薄:将晶圆研磨减薄,以便于后续的划片操作。…

2023京东双十一活动今晚20点开始?京东双十一时间安排和满减规则

2023京东双十一活动时间节点! 京东双十一红包,同样是每天可以领取,10月23日开始,面额最高11111元。 京东app搜索【红包到手210】即可领取双11红包 (数字要带上) 2023年京东双11整体将围绕六个时期展开: 1、第一波&…

如何处理前端多语言支持?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

最成功的国产手机得到央视认可,自研系统走向国际挑战谷歌

随着美国对中国企业不断采取措施,中国手机企业都在努力自主创新,日前又一家国产手机自研操作系统被网友质疑,不过央视却肯定了这家企业在创新方面的优势,赞扬了它带动中国制造走向国际市场。 央视给予赞誉的这家企业就是小米&…

QSlider 类使用教程

文章目录 1、简介2 、公共类型3、属性4、functions4.1、访问属性相关 function4.2、公共槽4.3、Signal4.4、其他方法 5、设置样式 QT 官方文档参考地址:https://doc.qt.io/qt-5/qslider.html 1、简介 QSlider是垂直或水平滑块条控件,最常见的应用就是视…

摩尔信使MThings的报文管理功能

设备通信过程中,通道报文是关键调试信息。为了高效地辅助调试运维过程,摩尔信使MThings提供报文记录功能,支持丰富且友好的方法进行报文管理,包括:收发颜色标记、异常识别、通道过滤、支持Modbus全系列; 查…

springboot项目多数据源导致事务报错问题

springboot项目多数据源导致事务报错问题 序言报错日志报错原因解决办法序言 序言 之前有一篇讲了如何使用多数据源动态配置,这里遇到的一个问题和大家分享,在使用多数据源时,对数据进行更新和插入避免不了使用事务,使用多数据源…

推荐系统:从经典模型到深度学习,你需要掌握什么?

文章目录 🌟 协同过滤:最经典的推荐模型,我们应该掌握什么?🌟 深度学习革命:深度学习推荐模型发展的整体脉络是怎样的?🌟 TensorFlow入门和环境配置🌟 模型特征、训练样本…

Delphi 编程实现拖动排序并输出到文档

介绍:实现拖动排序功能,并将排序后的内容输出到文档中。我们将使用 Delphi 的组件来创建一个界面,其中包括一个 Memo 控件用于输入内容,一个 ListBox 控件用于显示排序后的内容,并且提供按钮来触发排序和输出操作。 代…

万宾科技智能井盖传感器怎么使用?

时代在进步,科技在更新,人们身边的万事万物都在随着时代的脚步不断的前进。各种各样高科技技术在城市基础设施建设的过程中得到应用,很多智能产品不仅施工方便,而且可以向政府部门提供精准的数据,提高了相关管理人员的…

7.(vue3.x+vite)组件间通信方式之vuex

前端技术社区总目录(订阅之前请先查看该博客) 示例效果: Vuex 简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。 (1)Vuex 的状态存储是…

居民小区电动汽车有序充电策略研究

摘 要:针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题,提出一种采用延迟充电的电动汽车有序充电控制策略,并在分析国内外电动汽车有序充电的研究现状后,设计了居民小区电动汽车有序充电策略的总体框架。…

CAN总线测试——CAN一致性之物理层

CAN一致性物理层测试项 1.最小通讯电压测试2.最大通讯电压测试3.显性位/隐性位输出电压测试4.信号跳变沿测试5. 地偏移6. 终端电阻 1.最小通讯电压测试 2.最大通讯电压测试 3.显性位/隐性位输出电压测试 4.信号跳变沿测试 5. 地偏移 6. 终端电阻

基于51单片机DS18B20温度测量仿真设计(源码+仿真+报告+讲解)

本设计 基于51单片机DS18B20温度测量仿真设计 1 功能说明:2 讲解视频:3 仿真电路:4 程序:5 设计报告:6 资料清单(提供资料清单所有文件): 基于51单片机DS18B20温度测量仿真设计&…

vscode类似GitHub Copilot的插件推荐

由于GitHub Copilot前段时间学生认证的账号掉了很多,某宝激活也是价格翻了几倍,而却,拿来用一天就掉线,可以试试同类免费的插件哦。 例如:TabNine,下载插件后,他会提示你登录,直接登…