零基础小白Python入门必看:通俗易懂,搞定深浅拷贝

python代码100例子.doc python 编程,通过学习可以很好的理解python编程的例子希望大家学习,同时,自己在学习时也在不断的总结,哈哈哈哈 立即下载

Python中的深浅拷贝

在讲深浅拷贝之前,想先讲一下 is 和==的区别。

在进行对象是否相等比较的时候我们可以用is 和 ==

  • is:比较两个对象的引用是否相同,即 它们的id 是否一样
  • == : 比较两个对象的值是否相同。

id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。

如下

a = 1
b = 1

print(id(a)) # 2057422768
print(id(b)) # 2057422768
print(a is b) # True
复制代码

首先,会为整数1分配一个内存空间。 变量a 和 b 都指向了这个内存空间(内存地址相等),所以他们的id相等。

即 a is b 为 True

 

如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python裙,裙号930900780,领取python学习资料,会节约很多时间,减少很多遇到的难题。

但是,真的所有整数数字都这样吗? 答案是:不是! 只有在 -25 ~ 256范围中的整数才不会重新分配内存空间。

如下所示:

因为257 超出了范围,所以id不相同,所以a is b返回的值为False。

>>> a = 257
>>> b = 257
>>> print(id(a))
20004752
>>> print(id(b))
20001312
>>> print(a is b)
False
>>> print(a == b)
True
复制代码

这样做是考虑到性能,Python对-5 到 256 的整数维护了一个数组,相当于一个缓存, 当数值在这个范围内,直接就从数组中返回相对应的引用地址了。如果不在这个范围内,会重新开辟一个新的内存空间。

is 和 == 哪个效率高?

相比之下,is比较的效率更高,因为它只需要判断两个对象的id是否相同即可。

而== 则需要重载eq 这个函数,遍历变量中的所有元素内容,逐次比较是否相同。因此效率较低

浅拷贝 深拷贝

简单的了解了is, ==, 下面我们一起来看看Python中的深浅拷贝。

先说结论吧:

  • 浅拷贝:拷贝的是对象的引用,如果原对象改变,相应的拷贝对象也会发生改变
  • 深拷贝:拷贝对象中的每个元素,拷贝对象和原有对象不在有关系,两个是独立的对象

 

浅拷贝

a = [1, 2, 3]
b = list(a)  # 可以通过list 对列表进行浅拷贝
c = a.copy() # 也可以通过copy函数进行拷贝

# 浅拷贝后,a/b/c的id 各不相同,说明指向了不同的内存地址-- 即 生成了新的对象
print(id(a)) # 16301992
print(b, "id:", id(b)) # id:16562024
print(c, "id:", id(c)) # id:16561960

print(a == b) # True  值相同 返回True
print(a is b) # False  id不同所以 is比较返回False

# 给列表a 添加元素4
a.append(4)
print(a) # [1, 2, 3, 4]
print(b, c) # [1, 2, 3] [1, 2, 3]  b和c 不受影响
复制代码

以上可以看出,浅拷贝会分配一个新的内存空间,创建一个新的对象。但是如果被拷贝对象中有可变对象会怎么样呢? 看下面的代码

a = [1, 2, [3, 4]]
b = a.copy()

print(id(a)) # 23967528
print(id(b)) # 21738984
# 改变a中的可变对象
a[-1].append(5)
print(a)

# 在给a新增元素6
a.append(6)

# [1, 2, [3, 4, 5], 6]
print(a)

# [1, 2, [3, 4, 5]]
print(b)
复制代码

可以看出,在列表a中新增的元素6,并没有影响b。但是在a的嵌套列表中新增的元素5,却影响了元素b。

原因在于:对于a和b都指向了同一个列表[3, 4]。 所以当a中在列表新增元素5的时候,改变了那个列表的值,b也指向了那个列表,所以也会发生改变。

再看看下面的代码

a = [1, 2, (3, 4)]
b = a.copy()

print(id(a)) # 59162536
print(id(b)) # 60143400
# 改变a中的可变对象
a[-1] += (5, )

# [1, 2, (3, 4, 5)]
print(a)

# [1, 2, (3, 4)]
print(b)
复制代码

对于元组(3, 4),因为元组不可变,所以在元组中新增了元素5,实际上是生成了新的元组对象。而b列表中的元组引用并没有发生改变。

通过上面的两个例子可以看出浅拷贝可能会带来的弊端,在使用中需要大家进行相应的判断。或者去完整的拷贝某个对象,即 深拷贝。

 

深拷贝

所谓深拷贝呢,就是重新分配一个内存空间(新对象),将原对象中的所有元素通过递归的方式进行拷贝到新对象中。

在Python中 通过copy.deepcopy() 来实现深拷贝。

import copy
a = [1, 2, (3, 4)]
# 深拷贝
b = copy.deepcopy(a)

# 因为生成了新的对象所以,返回False
print(a is b)


a[-1] += (5,)
a.append(6)

print(a) # [1, 2, (3, 4, 5), 6]
print(b) # [1, 2, (3, 4)] 深拷贝后的对象,根本不受原对象的任何影响
复制代码

...

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以进裙930900780即可领取。

 

本文章素材来源于网络,如有侵权请联系删除。

YOLO11的持续学习:如何在不遗忘旧数据的情况下学习新类别 类增量学习(Class-Incremental Learning, CIL)是持续学习(Continual Learning)的一个重要分支,它指的是模型在不遗忘已学旧类别知识的前提下,逐步学习新类别的能力。与传统机器学习假设所有数据一次可用不同,类增量学习更贴近现实世界应用场景——新的类别数据往往会随着时间推移逐步出现。 举个例子,假设我们已经训练好一个YOLOv11模型用于检测"猫"和"狗"两种动物,现在需要让模型新增识别"兔子"的能力。传统方法需要收集所有类别(猫、狗、兔子)的数据重新训练,而类增量 阅读详情

相关推荐

STC15单片机双串口通信实战:串口2配置与多设备交互

本文详细介绍了STC15单片机双串口通信的实战配置,重点解析串口2的硬件连接、寄存器设置及多设备交互实现。通过实际项目案例和完整代码示例,帮助开发者快速掌握STC15串口2的配置技巧,解决常见通信问题,提升嵌入式系统开发效率。

weixin_29174013的博客 256

极简 Python:10 段代码,学会基础 python

本篇共包含 10 段简单的 Python,涉及常用语法和常用库(但毫无疑问删减了很多,比如没有字典)任何不懂的地方可直接留言~注:如果某个地方以 “#” 开始意思是:这是注释。

2401_85339817的博客 4840

企业信息化系统的组成模块-核心业务系统

通过标准化的数据流形成完整的业务闭环,CRM生成的销售订单驱动ERP的生产和采购,ERP将生产计划传递给MES执行,MES报工数据返回ERP进行成本核算,ERP再将交付信息同步给CRM供客户查询。生产管理确保高效交付,缩短订单周期。某贸易公司实施ERP供应链模块后,库存周转率从每年4次提升到8次,库存资金占用从2000万降到1200万,释放800万现金流,同时缺货率从15%降到5%。│ │库存 │ │ MRP │ │ ERP │ │ 云ERP/ │ │。

weiyvyy的博客 695

初学者必会的100个Python编程代码,入门全套资料都给朋友们整理好了,文末免费领!

初学者必会的100个Python编程代码,入门全套资料都给朋友们整理好了,文末免费领!

python03011的博客 1万+

.NET适配HarmonyOS进展 1. 前言

目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。

2301_76476890的博客 1461

实战分享:如何用YOLOv5s+BIFPN高效检测隧道裂缝(附数据集获取)

本文详细介绍了如何利用YOLOv5s结合BIFPN(双向特征金字塔网络)构建高效的隧道裂缝智能检测系统。文章从高质量数据集构建、针对性数据增强、模型架构选型与调优,到工程化部署全链路进行了实战分享,旨在为基础设施自动化巡检提供兼顾精度与速度的解决方案。

weixin_29062823的博客 380

入门需掌握的20个python代码

当今python编程语言的潮流已经成为不可阻挡的趋势,python以其较高的可读性和简洁性备受程序员的喜爱。而python编程中的一些小的技巧,运用的恰当,会让你的程序事半功倍。 以下的20个小的程序段,看似非常的简单,但是却非常的有技巧性,并且对个人的编程能力是一个很好的检验,大家应该在日常的编程中多多使用,多多练习。 1.字符串的翻转 字符串的翻转,首先最简单的方法就是利用切片的操作,来实现翻转,其次可以利用reduce函数来实现翻转,在python3中,reduce函数需要从func

BYGFJ的博客 9万+

PX4从放弃到精通(三):使用qt编译PX4

1 下载px4源码 2在Firmware所在目录下执行 mkdir Firmware-build cd Firmware-build cmake …/Firmware -G “CodeBlocks - Unix Makefiles” -DCONFIG=nuttx_px4_fmu-v5_default 第三步最后的px4_fmu-v5_default根据自己的情况修改 执行完后如图 打开QT 点击打开工程 选择源码的CmakeLists.txt文件 选择imported Kit 打开项目那一栏,构建目

超维空间科技的博客 1万+

Python 15个极简代码,新手小白必备入门!

本文将分享 15 个极简的 Python 代码示例,帮助新手小白快速掌握 Python 的基本语法和常用操作。以上 15 个极简代码涵盖了 Python 的基本语法和常用操作,非常适合新手小白入门学习。通过实践这些代码,你可以快速掌握 Python 的核心概念,为进一步学习打下坚实基础。解释:greet() 是一个简单的函数,接受一个参数 name。解释:print() 是 Python 中用于输出内容的函数。列表是 Python 中常用的数据结构,用于存储一组数据。

Python_trys的博客 6352

初识数据之特征选择

【代码】初识数据之特征选择。

M_inherit的博客 1134

安装 miniconda linux

安装 miniconda linux

jacke121的专栏 1万+

18个Python入门经典必背的程序分享

18个Python入门经典必背的程序分享

xiangxue888的博客 1万+

Laser-Marking 激光振镜打标机的开源代码 - 下载 - 搜珍网

为了方便开发者的使用和定制化需求,我们在这里提供激光振镜打标机的开源代码,并附带详细的描述。首先,让我们来了解一下激光振镜打标机的基本原理。振镜系统由两个可移动的反射镜组成,可以控制激光束在水平和垂直方向上的偏转角度,从而实现对工件的精确控制。通过这段开源代码,开发者可以根据自己的需求对激光振镜打标机进行二次开发和定制化。你可以修改振镜角度、打标速度等参数,也可以添加其他功能,例如自动识别和追踪等。首先,我们创建了一个串口对象,用于与激光振镜打标机进行通信。函数实现了对用户输入文本的打标操作。

TechProX的博客 1279

零基础python必背代码-零基础小白Python入门必看:通俗易懂,搞定深浅拷贝

Python中的深浅拷贝在讲深浅拷贝之前,想先讲一下 is 和==的区别。在进行对象是否相等比较的时候我们可以用is 和 ==is:比较两个对象的引用是否相同,即它们的id 是否一样== : 比较两个对象的值是否相同。id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。如下a = 1b = 1print(id(a)) # 2057422768print(id(b)...

weixin_37988176的博客 318

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

python深浅拷贝通俗讲解_零基础小白Python入门必看:通俗易懂,搞定深浅拷贝

Python中的深浅拷贝在讲深浅拷贝之前,想先讲一下 is 和==的区别。在进行对象是否相等比较的时候我们可以用is 和 ==is:比较两个对象的引用是否相同,即它们的id 是否一样== :比较两个对象的值是否相同。id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。如下a = 1b = 1print(id(a)) # 2057422768print(id(b)...

weixin_39901213的博客 111

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python 判断数组中是否在某个范围以内_零基础小白Python入门必看:通俗易懂,搞定深浅拷贝...

Python中的深浅拷贝在讲深浅拷贝之前,想先讲一下 is 和==的区别。在进行对象是否相等比较的时候我们可以用is 和 ==is:比较两个对象的引用是否相同,即 它们的id 是否一样== : 比较两个对象的值是否相同。id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。如下a = 1 b = 1 print(id(a)) # 2057422768 print(...

weixin_39809540的博客 954

python深浅拷贝通俗讲解_通俗易懂,搞定Python中的深浅拷贝

Python中的深浅拷贝在讲深浅拷贝之前,想先讲一下 is 和==的区别。在进行对象是否相等比较的时候我们可以用is 和 ==is:比较两个对象的引用是否相同,即 它们的id 是否一样== : 比较两个对象的值是否相同。id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。如下a = 1b = 1print(id(a)) # 2057422768print(id(b...

weixin_39770821的博客 119

通俗易懂,搞定Python中的深浅拷贝

Python中的深浅拷贝 在讲深浅拷贝之前,想先讲一下 is 和==的区别。 在进行对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == : 比较两个对象的值是否相同。 id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。 如下 a = 1 b = 1 print(id(a)) # 2057422768 print(id(b)) # 2057422768 print(a is b) # True 首先,

胖虎 380

python复制print内容_通俗易懂,搞定Python中的深浅拷贝

Python中的深浅拷贝在讲深浅拷贝之前,想先讲一下 is 和==的区别。在进行对象是否相等比较的时候我们可以用is 和 ==is:比较两个对象的引用是否相同,即 它们的id 是否一样== : 比较两个对象的值是否相同。id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。如下a = 1b = 1print(id(a)) # 2057422768print(id(b...

weixin_39895977的博客 625

标题:闭包 · 装饰器 · 深浅拷贝——Python「高阶三剑客」一日通 #Day4

大家好,我是。昨天我们用面向对象思想把“学生报名”和“小明减肥”两个场景全部代码化,今天继续进阶,一次性搞定这三件让新手头秃的“高阶三剑客”。读完你能:① 用闭包把函数变量“续命”;② 用装饰器给任何函数零侵入加功能;③ 一眼看穿深浅拷贝的内存陷阱。

2201_75887467的博客 422

零基础学Python:列表推导式及深浅拷贝

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习资料、代码以及交流解答点击即可加入 列表推导式 Python里面有个很棒的语法糖(syntactic sugar),它就是 list comprehension ,有人把它翻译成“列表推导式”,也有人翻译成“列表解析式”。名字听上去很难理解,但是看它的语法就很清晰了。虽然名字叫做 list compreh

【优快云官方推荐】 390

Python 中的深浅拷贝

今天在写代码的时候遇到了一个这个问题,就是我从数据库里面 查询出来几个对象,然后我遍历,想用id作为这个对象的key,这个对象值,作为value,这样的话,就将一个列表转换成了一个字典,方便时候。但是在使用的时候,出现问题了,就是我在取出来之后,我需要去修改这个对象的值(在一个循环里面),这样就导致了一个对象多次被取出来修改。这样就会出现一个问题,就是我出来的对象,使用一个对象,我每次修改的都是一个,值会是最后一次修改的值,这并不是我想要的。所以考虑到python的深浅拷贝。...

jet5devil的博客 452

Python数据结构终极指南:从入门到精通,一篇就够了

本篇文章系统梳理了Python五大核心数据结构:字符串、列表、元组、字典、集合。从基础创建、常用方法到底层原理、性能分析,结合大量代码示例与实战技巧,全方位讲解各自适用场景与避坑指南。无论你是刚入门的初学者还是想巩固基础的进阶者,这篇万字长文都能帮你彻底吃透数据结构,写出更高效、更优雅的Python代码。文末还附赠大厂面试高频题,助力你的求职之路!建议收藏,反复查阅。

kaiwen332的博客 888

python 路径拼接字符串_“搞定”面试官,最常见的Python面试题(文末资料大礼包)...

Python作为人工智能知识的基础知识,加上有许多公司都在招python方面的程序员,那么小编在这里整理了一些Python最常见的面试题。在python基础中,很明显我们需要了解python的特性,像面向对象思想,字符串的操作,推导式,实例化,多线程多进程以及初始化这些都是必须了解的。在python中,如何交换两个变量的值这个问题,考了python特殊的语法,也就是a, b = b, a,这个表达...

weixin_39616003的博客 94

Python零基础高效学习路径:从最小知识栈到实战项目

编程学习本质上是技能习得而非知识输入,关键在于构建最小可行知识栈并通过项目实践驱动。Python作为当前最流行的编程语言之一,其核心价值在于解决实际问题,如数据爬取、自动化处理和数据分析。理解编程语言的语法基础是第一步,但更重要的是掌握如何将知识应用于工程实践。在Python学习中,应聚焦于环境搭建、核心语法、常用库(如requests、pandas)和数据结构(列表、字典)等基础概念,而非追求大而全的教程。通过设计微型项目(如爬虫、数据分析),学习者可以将被动输入转化为主动输出,从而真正掌握解决实际问题的

weixin_34387468的博客 386
上一篇: 零基础小白学习:python之最详细列表篇
下一篇: 零基础小白必看篇:学习Python入门之面对对象基础
python阿喵
博客等级 码龄6年 169粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值