python浅拷贝和深拷贝详解

Python 中的浅拷贝与深拷贝详解 Python 对象复制摘要 Python 提供浅拷贝和深拷贝两种复制机制。浅拷贝(copy.copy)创建新对象但共享嵌套引用,修改嵌套内容会影响原对象;深拷贝(copy.deepcopy)递归复制所有嵌套对象,实现完全独立。自定义类可通过实现 copy 和 deepcopy 方法控制复制行为。浅拷贝适用于简单对象或性能敏感场景,深拷贝适合需要完全隔离的复杂数据结构。关键区别在于是否复制嵌套对象,选择取决于具体需求。 (98字) 阅读详情

假设有一个列表,如下:

然后呢,我打印出这四个列表的内存地址:

l = [1, 2, 3, 4, [1, 2, 3] ]                                   id(l)                      --------------->     1631063137352        

new_l = l                                                        id(new_l)              --------------->     1631063137352

copy_l = copy.copy(l)                                     id(copy_l)             --------------->     1631063137416

deepcopy_l = copy.deepcopy(l)                     id(deepcopy_l)     --------------->     1631063026632

可以看到,使用copy这个模块创建的浅拷贝和深拷贝在内存中都有一个新的内存空间。

进一步查看四个列表中不可变类型的id值:

l = [1, 2, 3, 4, [1, 2, 3] ]                                   id(l[1])                      --------------->     1400022144       

new_l = l                                                        id(new_l[1])              --------------->     1400022144

copy_l = copy.copy(l)                                     id(copy_l[1])             --------------->     1400022144

deepcopy_l = copy.deepcopy(l)                     id(deepcopy_l[1])     --------------->     1400022144

再查看可变类型的id值:

l = [1, 2, 3, 4, [1, 2, 3] ]                                   id(l[-1])                      --------------->     1631063137544       

new_l = l                                                        id(new_l[-1])              --------------->     1631063137544

copy_l = copy.copy(l)                                     id(copy_l[-1])             --------------->     1631063137544

deepcopy_l = copy.deepcopy(l)                     id(deepcopy_l[-1])     --------------->     1631063186312
————————————————
版权声明:本文为优快云博主「StartFromToday」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/w494675608/article/details/82114798

 

#encoding=utf-8

import copy
a=[1,2,3,4,5,['a','b']]
#原始对象
b=a#赋值,传对象的引用
c=copy.copy(a)#对象拷贝,浅拷贝
d=copy.deepcopy(a)#对象拷贝,深拷贝
print "a=",a,"    id(a)=",id(a),"id(a[5])=",id(a[5])
print "b=",b,"    id(b)=",id(b),"id(b[5])=",id(b[5])
print "c=",c,"    id(c)=",id(c),"id(c[5])=",id(c[5])
print "d=",d,"    id(d)=",id(d),"id(d[5])=",id(d[5])
print "*"*70

a.append(6)#修改对象a
a[5].append('c')#修改对象a中的['a','b']数组对象
print "a=",a,"    id(a)=",id(a),"id(a[5])=",id(a[5])
print "b=",b,"    id(b)=",id(b),"id(b[5])=",id(b[5])
print "c=",c,"       id(c)=",id(c),"id(c[5])=",id(c[5])
print "d=",d,"            id(d)=",id(d),"id(d[5])=",id(d[5])

结果:
 

从程序的结果来看,列表a和b是赋值操作,两个对象完全指向同一个地址,a和b就是同一块地址的两个引用,其实就是一个东西,所以一个对象在修改浅层元素(不可变)或深层元素(可变)时,另一个对象也同时在变;

c是a进行浅拷贝生成的对象,可以看到a(或b)和c两个对象整体的id是不同的,但是里面的第5个元素-列表的地址却是相同的(指向同一个地址),所以b在浅层次元素层面(不可变)增加一个元素时,c并没跟着增加,但是b的第5个元素-列表在增加一个元素时,c的第5个元素也跟着增加了,这就是因为b和c的第5个元素-列表是指向同一个地址的,这个地址上的值变了,在两个地方会同时改变;

再看d,d的浅层次元素(不可变)和 深层次元素(可变)的地址和a,b,c都不一样,所以,a,b,c无论怎么修改,d都不会跟着改变,这就是深拷贝的结果。

 

原文链接:https://www.cnblogs.com/xiaxiaoxu/p/9742452.html

 

l[::-1]   结果应该是 [[1, 2, 3], 4, 3, 2, 1]

list[indexStart: indexEnd: step], 当step>0的时候,正向取值, 也就是从左往右取值,当step<0时,逆向取值。所以l[::-1]都是取的列表的逆序表, 也就是从右往左取值。

分片操作其实就是按照一定的顺序访问序列中某一范围内的元素,记住一点就行了,那就是在一定的访问顺序中,indexStart所对应的元素必须先于indexEnd所对应的元素被访问到,否则,分片操作返回的就是空的序列;而访问元素的顺序由step决定是从左往右,还是从右往左。

因此,l[0: -1: -1]是取不到值得。step < 0 ,从右往左访问数据, 先访问到得是indexEnd,再访问到indexStart。因此取到得得列表是空列表。
————————————————
版权声明:本文为优快云博主「StartFromToday」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/w494675608/article/details/82114798

【Python浅拷贝与深拷贝详解】 本文通过10+个典型场景对比,深入解析Python中浅拷贝与深拷贝的核心差异,并提供可落地的工程实践方案。 阅读详情

相关推荐

【Python高级】详解 深拷贝和浅拷贝

浅拷贝使用copy.copy函数深拷贝使用函数不管是给对象进行深拷贝还是浅拷贝,只要拷贝成功就会开辟新的内存空间存储拷贝的对象。浅拷贝和深拷贝的区别是:浅拷贝最多拷贝对象的一层,深拷贝可能拷贝对象的多层。加油!努力!

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 1847

Python 深拷贝和浅拷贝详解

Python深拷贝和浅拷贝详解 浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。 深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。 1.浅拷贝 使用数据类型本身的构造器 对于可变的序列,还可以通过切片操作符 : 来完成浅拷贝 Python 还提供了对应的函数 copy.copy() 函数,适用于任何数据类型 1.1 使用数据类型本身的构造器 lis

qq_40630902的博客 5万+

用Multisim仿真AD630锁定放大器:从2012年电赛A题实战到避坑指南

本文详细介绍了如何使用Multisim仿真AD630锁定放大器,从2012年电赛A题实战出发,提供完整的电路搭建、参数优化及避坑指南。重点解析AD630的开关调制架构和双相位检测的工程实现,帮助读者在强噪声背景下有效提取微弱信号,提升电子设计竞赛和工程实践中的信号处理能力。

weixin_42549451的博客 203

【Python】python深拷贝与浅拷贝详解(必须掌握)

(关注“测试开发自动化” 弓中皓,获取更多学习内容)

测试开发自动化 1万+

HTB_Bike靶机之模板注入

船到桥头自然直 文章目录信息收集模板引擎SSIT 模板注入后放答案 信息收集 日常 A 扫描,两个端口 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA) | 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:.

网络安全学习 798

TwinCAT3 Modbus-TCP Client/Server使用

/起始地址是12289//起始地址是12294。

panjinliang066333的博客 7734

Python--深浅复制

深浅赋值其实都是开启新的空间来存放,只是内部元素的指向地址的区别。如果内部元素是不可变类型(number / string / tuple),则两个元素的地址相同;如果内部元素是可变类型(list / set / dir),若是浅赋值,则两个元素地址相同,若是深复制,则地址不同。关于深浅复制其实是对可变类型的讨论。

忘心虚无的博客 776

机器学习 -- 信用卡评分模型 -- 互联网金融风控

互联网金融主要分为资金类和资产类。资金类主要是理财产品,吸储,主要指标是用户转化、留存和复投,重在客户运营。资产类主要是贷款,包括消费金融和现金贷,小额贷款属于此类,主要目的是用户转化,还款和风险控制,信用卡评分模型就属于风险控制。 信用评分作用是对贷款申请人(信用卡申请人)做风险评估分值的方法。 信用卡评分是以大量数据的统计结果为基础,根据客户提供的资料和历史数据对客户的信用进行评估,评分卡模型...

XiaoMaEr66的博客 2420

Python中深拷贝和浅拷贝详解!

由于新对象与原始对象并无共享内存地址,故而二者完全独立,因此更改其中一个对象的值并不会影响另一个对象的值。浅复制是指新建一个对象,然后将原始对象的引用复制给新对象。由于新对象与原始对象同一内存地址,因此一个对象的值被修改后,另一个对象的值也会受到影响。深拷贝和浅拷贝在Python中是非常重要的存在,但很多人对它们了解的并不是很清楚,本文为大家详细讲解一下深浅拷贝的概念、使用场景以及注意事项,希望能够给你带来帮助。在使用深拷贝时,如果对象的层次结构比较复杂,可能会导致性能问题,因此必须小心使用深拷贝。

oldboyedu1的博客 1448

[统计模型] 基于R的潜在剖面分析(LPA)

本文主要介绍基于R进行潜在剖面分析(Latent Profile Aanalysis, LPA)。 关于潜在类别分析LCA/潜在剖面分析LPA的概念和区别,可以参考一下这篇文章: 潜在类别分析LCA \潜在剖面分析LPA介绍https://www.jianshu.com/p/4c830094131e?utm_campaign=maleskine 但是此文对潜类别分析的阐释还比较生涩,而且没有具体的代码编写、模型优选等内容。本文旨在丰富LPA的内容,并希望和大家交流、共同进步。 1. 什么是潜类别分.

bigstar863的博客 1万+

华为OD机试双机位C卷:打印机队列 (C++/Py/C/Java/Js/Go)

华为OD机试双机位C卷 打印机队列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 打印机队列。

qq_45776114的博客 1793

python中的深拷贝和浅拷贝(详解)

除ID之外,其他状态都有可能发生改变可变对象有:列表、集合、字典l = []print("修改前id= ", id(l))print("修改后id= ", id(l))print(l)结果:修改前id= 2597667097216修改后id= 2597667097216[132]2、什么是不可变对象,有哪些?包括id在内的各种状态,都不会发生变化不可变对象有:大部分是python内置数据类型: 数字,字符串,元组i = 123print("修改前id= ", id(i))

m0_68021259的博客 1970

泛微OA自定义post接口和路径(无侵入)

泛微OA自定义post接口和路径(无侵入)

技术分享 3869

Python深拷贝和浅拷贝详解

目录 前言 一、浅拷贝?深拷贝? 二、浅拷贝和深拷贝的实例 1.浅拷贝实例 2.深拷贝实例 三、图解 总结 前言 详细解释关于Python的深拷贝和浅拷贝问题 一、浅拷贝?深拷贝? 浅拷贝:拷贝父对象,不会拷贝对象内部的子对象。如{1: [1,2,3]},浅拷贝时不会拷贝对象内部的子对象 [1,2,3],所以对子对象的操作不仅对自己这一份产生影响,对“像”自己的另一份也会产生影响。 深拷贝:使用了copy模块的deepcopy方法,完全是将一个对象完完整整的拷贝了独立的另一份,所以对

RitaAndWakaka的博客 692

基于Simulink的超级电容与锂电池混合储能协调控制仿真

摘要:本文介绍基于Simulink的光伏-混合储能系统(HESS)建模与仿真方法,通过超级电容和锂电池的协同控制实现功率平抑。系统采用直流耦合架构,利用一阶低通滤波法将总功率分解为低频(锂电池承担)和高频分量(超级电容承担),并设计SOC自平衡机制维持超级电容工作点。仿真结果表明,该方案可使锂电池电流波动降低62%,光伏功率波动率降至7.5%,有效延长电池寿命。文章详细展示了从主电路搭建、功率分配到闭环控制的完整实现步骤,为新能源系统储能优化提供实用参考。

amy_mhd的博客 136

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Python 浅拷贝与深拷贝详解】

Python中的对象拷贝分为浅拷贝和深拷贝两种方式。浅拷贝(copy.copy())创建新对象但保留子对象引用,修改可变子对象会影响原对象;深拷贝(copy.deepcopy())递归创建完全独立副本,与原对象彻底隔离。示例显示:浅拷贝仅复制顶层不可变元素,而共享可变子对象引用;深拷贝则完全复制所有层级。

qq_48002970的博客 604

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python进阶:浅拷贝与深拷贝详解

而’is’操作符比较的是对象的身份标识是否相等,即它们是否是同一个对象,是否指向同一个内存地址,在python中,每个对象的身份标识,都能通过id(object)获得,因此’is’操作符,相当于比较对象之间的id是否相等。相当于l2会重新开辟一块内存区域,会存储1,2,3,但是不会存储[4,5],只是存储[4,5]对象的引用,如下图所示。我们知道,对于不可变数据类型,没有提供修改它的方法,是不是可以理解为无论是浅拷贝还是深拷贝返回的结果都是一样的。= id(b),即a is b返回的是False。

nzbing的博客 1272

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Python】深拷贝和浅拷贝详解

深拷贝和浅拷贝详解浅拷贝浅拷贝注意事项 浅拷贝(shallow copy)、深度拷贝(deep copy) 浅拷贝 常见的浅拷贝的方法,是使用数据类型本身的构造器,比如下面两个例子: list1 = [1, 2, 3] list2 = list(list1) print(list2) print("list1==list2 ?",list1==list2) print("list1 is list2 ?",list1 is list2) 输出: [1, 2, 3] list1==list2 ? True

一个写湿的程序猿 426

python深拷贝及浅拷贝详解

简单粗暴从例子先看的,然后再详解深拷贝及浅拷贝两个概念~ 浅拷贝: 栗子1 list1 = [1,2,3] list2 = list(list1) #这里就是浅拷贝,也可以写作下面两种写法 #list2 = list1[:] #list2 = copy.copy(list1) print(list2) print("list1==list2 ?",list1==list2) print("list1 is list2 ?",list1 is list2) 结果1: [1, 2, 3] list1==lis

lzz555517的博客 815

Python 的深拷贝与浅拷贝详解

Python 深拷贝与浅拷贝

威桑的博客 2173

详解Python的深拷贝与浅拷贝

Python的深拷贝与浅拷贝浅拷贝深拷贝 先举个例子。 列表list。 浅拷贝 import copy a = [1,2,3,[9,7]] b = copy.copy(a) # 浅拷贝 print a, id(a), id(a[3]) print b, id(b), id(b[3]) a.append(6) print a print b a[3].append(99) print a print b 运行结果 [1, 2, 3, [9, 7]] 65877896 65878600 [1, 2, 3,

也无风雨也无晴 314

Python中的浅拷贝与深拷贝详解

一.什么是浅拷贝和深拷贝        浅拷贝和深拷贝在Python中的对象参数传递中是一个非常重要的概念。        浅拷贝是不拷贝子对象的内容,只拷贝子对象的引用。深拷贝是连子对象的内存也全部拷贝一份,对子对象的修改不修改源对象。        这样说起来还是非常的抽象,...

yyzsir的博客 1086

Python 中的深拷贝与浅拷贝详解

浅拷贝是指创建一个新对象,但只复制对象的引用,而不复制对象本身。对于可变对象(如列表、字典、集合等),浅拷贝只会复制对象的第一层,而不会递归地复制嵌套对象。深拷贝是指创建一个新对象,并递归地复制所有嵌套对象。深拷贝会完全复制原对象及其所有嵌套对象,因此修改拷贝对象不会影响原对象。通过本文的介绍,你已经全面掌握了 Python 中的深拷贝与浅拷贝,理解了它们的区别和使用方法。浅拷贝:使用,只复制对象的第一层,嵌套对象的引用仍然指向原对象。深拷贝:使用,递归地复制所有嵌套对象,创建完全独立的新对象。区别。

2409_88939367的博客 690

Python中深拷贝与浅拷贝详解

浅拷贝和深拷贝一直傻傻的分不清,甚至有时候会理解反。今天就简单总结一下python中的浅拷贝和深拷贝。

Catying的博客 292

python深拷贝浅拷贝区别_Python的赋值、深拷贝与浅拷贝的区别详解

在python中,给一个对象赋值,实际上就是对象对内存空间存储的值的引用。当我们把对象赋值给另一个变量的时候,这个变量并没有拷贝这个对象,而只是拷贝了这个对象的引用而已。一般情况下我们会通过三种方法来实现拷贝对象的引用。Python直接赋值直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的变量也会做相同的改变。其实就是对‘对象'的引用示例:>>> list_demo ...

weixin_39752087的博客 168
上一篇: LeetCode092. Reverse Linked List II
下一篇: python中的None,is和==
船桥
博客等级 码龄9年 5粉丝 194原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值