【python】探索python中的深拷贝和浅拷贝的艺术之旅
创始人
2024-11-27 09:05:02
0

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python入门必备,基础语法到进阶实战教学
景天的主页:景天科技苑

文章目录

  • 深浅拷贝
    • 浅拷贝
    • 深拷贝
    • 浅拷贝代码解析
    • 深拷贝代码解析
    • 其他容器的深拷贝
  • 总结

深浅拷贝

Python 的所有变量其实都是指向内存中的对象的一个指针,所以所有的变量无类型限制,可以指向任意对象。指针的内存空间大小是与类型无关的,其内存空间只是保存了所指向数据的内存地址。
对象还分两类:一类是可修改的,一类是不可修改的。可修改(mutable)的类型叫做值类型,不可修改(immutable)类型叫做引用类型。
不可变(immutable)对象类型
int,float,decimal,complex,bool,str,tuple,range,frozenset,bytes
可变(mutable)对象类型
list,dict,set,bytearray,user-defined classes (unless specifically made immutable)
为了探索对象在内存的存储,我们可以求助于Python的内置函数id()。它用于返回对象的身份(唯一标识符,标识符是一个整数)其实,这里所谓的身份,就是该对象的内存地址。

浅拷贝

浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;
如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

深拷贝

深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。
源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。深拷贝相比于浅拷贝速度较慢并且花销较大。

简单说就是:
浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存。
深拷贝会创造一个一模一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。

在python中
浅拷贝(copy()):拷贝父对象,不会拷贝对象内部的子对象。
深拷贝(deepcopy()):是copy模块中的方法,完全拷贝了子对象和父对象

单纯的 = 赋值的话,针对可变类型,改变原数据,新数据也跟着变化,新数据完全引用旧数据地址

a = 100 b = a a = 200 print(b) 

在这里插入图片描述

lst1 = [1,2,3] lst2 = lst1 lst1.append(4) print(lst2) 

浅拷贝代码解析

先导入copy模块

import copy 

模块.方法() 同名模块下的同名方法
方法一 (推荐)

lst1 = [1,2,3] lst2 = copy.copy(lst1) lst1.append(10) print(lst2) print(lst1) 

copy之后lst2就与lst1不在同一内存地址
在这里插入图片描述

方法二

这个是列表内置的方法

lst1 = [1,2,3] lst2 = lst1.copy() lst1.append(11) print(lst1) print(lst2) 

在这里插入图片描述

浅拷贝对二层以及更多层容器的拷贝,是拷贝的引用,当修改原数据,新数据也会变化
在这里插入图片描述

深拷贝代码解析

把所有层级的容器元素都单独拷贝一份,放到独立的空间中

现象

lst1 = [1,2,3,[4,5,6]] lst2 = copy.copy(lst1) lst1[-1].append(77) lst1.append(8888) print(lst2) print(lst1) 

针对多层级容器,浅拷贝只拷贝第一层可变类型容器,内层容器仍然是引用,不做拷贝,如下,针对内层容器的修改,lst2是引用的lst1的地址,内容不变
在这里插入图片描述

import copy lst1 = [1,2,3,[4,5,6]] lst2 = copy.deepcopy(lst1) lst1[-1].append(999) print(lst2) print(lst1) 

深拷贝把所有层级的容器中所有元素都单独拷贝一份,形成独立的空间,原数据跟新拷贝出来的数据不共享内存空间,修改原数据对新数据不会有影响
所以,为了满足拷贝后的数据不影响新数据,就用深拷贝
在这里插入图片描述
在这里插入图片描述

其他容器的深拷贝

lst1 = (1,2,3,{"a":1,"b":[10,20]}) lst2 = copy.deepcopy(lst1) lst1[-1]["b"].append(30) print(lst1) print(lst2) 

在这里插入图片描述

总结

浅拷贝:
只拷贝一级容器中的所有元素独立出一个单独的空间,针对多层容器,只拷贝了第一层容器,内层容器仍然是引用原数据
深拷贝:
把所有层级的容器中所有元素都单独拷贝一份,形成独立的空间

相关内容

热门资讯

四分钟掌握!cloudpoke... 四分钟掌握!cloudpoker云扑克辅助(wepoke辅助)一贯真的有挂(2025已更新)(哔哩哔...
八分钟解密!智星德州菠萝app... 八分钟解密!智星德州菠萝app下载,(WPk)果然真的有挂,技巧教程(有挂机制)-小红书1、智星德州...
揭秘(德州wepower)都是... 揭秘(德州wepower)都是真的有挂(透视)外挂透明挂辅助挂(2023已更新)(哔哩哔哩);1、全...
六分钟黑科技!智星德州有挂(透... 六分钟黑科技!智星德州有挂(透视辅助)外挂透明挂辅助软件(2025已更新)(哔哩哔哩)1、在智星德州...
5分钟理解!wepoke软件透... 5分钟理解!wepoke软件透明挂(wpk透视辅助工具)总是真的有挂(2020已更新)(哔哩哔哩);...
6分钟内幕!fishpoker... 6分钟内幕!fishpoker app辅助,(微扑克)果然真的有挂,力荐教程(有挂安装)-知乎1、首...
两分钟黑科技!德州poker有... 两分钟黑科技!德州poker有外挂(软件透明挂)外挂透明挂辅助工具(2020已更新)(哔哩哔哩)1)...
一分钟了解(扑克时间)都是真的... 一分钟了解(扑克时间)都是真的有挂(黑科技)外挂透明挂辅助app(2021已更新)(哔哩哔哩)1、用...
十分钟体悟!wpk线上德州俱乐... 十分钟体悟!wpk线上德州俱乐部(wpk透明挂)果真真的有挂(2022已更新)(哔哩哔哩);1、完成...
三分钟实锤!aa扑克发牌机制,... 三分钟实锤!aa扑克发牌机制,(好运大菠萝)好像真的有挂,曝光教程(有挂机制)-今日头条1、构建自己...