Python —— 深拷贝和浅拷贝
1、浅拷贝
浅拷贝就是对一个对象父级(外层)的拷贝,并不会拷贝子级(内部)。简单举个例子:
import copya = [1, 2, 3]
b = [3, 4, 5]
c = [a, b]
d = copy.copy(c)
上面代码中,c是对象父级,a和b是对象子级。当使用浅拷贝copy.copy()时,只会对c进行拷贝,不会对a和b进行拷贝。
具体可以进行验证:
import copya = [1, 2, 3]
b = [3, 4, 5]
c = [a, b]
d = copy.copy(c)print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))
通过上面的代码可以发现,c和d的内存地址是不一样的,而子级的内存地址是一样的。
因此可以简单理解,当一个对象有对象父级和对象子级时,浅拷贝只会对对象父级进行拷贝而不会对对象子级进行拷贝。
但是当对象不分父级和子级的时候,浅拷贝就是简单的对对象进行拷贝:
import copya = [1, 2, 3]
b = copy.copy(a)print(id(a))
print(id(b))
这种情况下a和b的内存地址是不一样的。
还需要注意的一种情况是,当对象父级的数据类型为不可变类型,比如是元组时,浅拷贝对象的时候还是引用原对象的地址。
import copya = [1, 2, 3]
b = [3, 4, 5]
c = (a, b)
d = copy.copy(c)print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))
在上面这种情况下,对象父级是一个不可变数据类型,元组。因此在使用浅拷贝的时候,是对原对象的直接引用。因为父级对象是不可变类型,因此如果要修改父级的数据,会重新开辟新的内存空间进行存放,因此浅拷贝引用原对象的地址是没有问题的。
2、深拷贝
深拷贝是对一个对象的所有层次的拷贝,内部和外部都会被拷贝。
简单举个例子:
import copya = [1, 2, 3]
b = [2, 3, 4]
c = [a, b]
d = copy.deepcopy(c)print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))
代码中copy.deepcopy()是对原对象进行深拷贝,这种情况下,对象父级被拷贝,对象子级也会被拷贝,对象之间的内存地址完全不同。
但是深拷贝中需要注意,当对象父级是一个不可变类型,对象子级是一个不可变类型,当使用深拷贝的时候,新对象是对原对象的引用。
import copya = (1, 2, 3)
b = (2, 3, 4)
c = (a, b)
d = copy.deepcopy(c)print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))
代码中的对象父级和子级都是不可变类型,元组。这种情况下,深拷贝得到的新对象是对原对象的引用,两者对应的内存地址是一样的。
深拷贝的作用是在做数据清洗或者数据修改等操作前,对原始数据复制一份,以防数据修改,找不到原数据。
当对象父级和对象子级是不可变类型时,是不能在原始对象上对数据进行修改的,这时候深拷贝对对象的拷贝是引用就可以理解了。因为我是不可变数据,所以怎么对数据进行清洗也不会改变原始数据,所以直接对原对象进行引用就可以了。
Python —— 深拷贝和浅拷贝相关推荐
- python深拷贝和浅拷贝的使用场景_Python深拷贝和浅拷贝使用方法
Python深拷贝和浅拷贝使用方法 发布时间:2020-06-06 16:52:01 来源:亿速云 阅读:182 这篇文章运用了实例代码展示Python深拷贝和浅拷贝使用方法,代码非常详细,可供感兴趣 ...
- 【转载】图解 Python 深拷贝和浅拷贝
伯乐在线 > Python - 伯乐在线 > 所有文章 > 基础知识 > 图解 Python 深拷贝和浅拷贝 图解 Python 深拷贝和浅拷贝 2015/09/28 · 基础 ...
- python怎么避免浅拷贝_深度解读Python深拷贝与浅拷贝问题
Illustrations by Leon Tukker ♚ 作者:PayneLi,Python全家桶,主要讲述数据挖掘.机器学习和深度学习领域的前沿技术,同时还会推荐一些行业最新论文.技术专家的经验 ...
- 【233】python—深拷贝与浅拷贝的区别
♣ 题目部分(原文见公众号:python宝) python宝 https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU5NjI ...
- 一文了解Python深拷贝与浅拷贝问题
https://www.toutiao.com/a6661446735224635907/ 在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就 ...
- Python深拷贝和浅拷贝的区别
首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别. 什么是可变对象,什么是不可变对象: 可变对象 ...
- python深拷贝和浅拷贝的使用场景_深拷贝、浅拷贝的理解与使用场景
什么是深拷贝.浅拷贝? 通俗解释:深拷贝是内容拷贝,浅拷贝是地址拷贝 区别点: 深拷贝会创建一个新的内存空间,拷贝的值是一样的,但是内存地址不一样. 浅拷贝只是拷贝指向原来对象的地址,使原对象的引用计 ...
- python——深拷贝与浅拷贝的区别
一.浅拷贝 原列表 data1=[8,24,[2,30,35]] 浅拷贝后的列表 data2=data1.copy()原列表的内存地址 print(id(data1)) 2726096606848 拷 ...
- 图解python_图解Python深拷贝和浅拷贝
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: will ...
- Python 深拷贝和浅拷贝
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: will= ...
最新文章
- 惠普z840工作站linux,全模块战神 惠普旗舰级Z840工作站评测
- php8的jit如何使用,PHP JIT 是什么?PHP8 新特性之 JIT 图文详解
- 轰动程序员圈的大事:女程序员将代码写到退休,返聘再续传奇
- 第十六届全国大学生智能车竞赛RT-Thread创新专项奖获奖名单
- 我的世界:一个村落(其一)
- OpenGL 深度测试depth test 的实例
- rxjs 里的pipe operator
- 一切为了孩子——一位IT麻麻的新西兰移民记录
- Oracle下的Databse,Instance,Schemas
- EasyExcel入门使用
- 构建测试的体系化思维(基础篇)
- Vue深入学习1—mustache模板引擎原理
- 又是系统时间惹的祸 TreeView
- redis在window下的启动
- t_user is not mapped [from t_user as u where u.loginname = :loginname and u.password =:password]
- SpringBoot自动装配原理,这一篇就够了!
- pdffactory 打印字体_PDFFactory
- 微信测试是否被删软件,检测微信好友是否把你删除的3种方法,最后一种最好用!...
- 《黄帝内经》四季养生法
- javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 465;