Python对象的浅拷贝与深拷贝
在讲我们深浅拷贝之前,我们需要先区分一下拷贝和赋值的概念。看下面的例子
a = [1,2,3]
赋值:
b = a
拷贝:
b = a.copy()
上面的两行代码究竟有什么不同呢?带着这个问题,继续
看了上面这张图,相信大家已经对直接赋值和拷贝有了一个比较清楚的认识。
直接赋值:复制一个对象的引用给新变量
拷贝:复制一个对象到新的内存地址空间,并且将新变量引用到复制后的对象
我们的深浅拷贝只是对于可变对象来讨论的。 不熟悉的朋友需要自己去了解可变对象与不可变对象哦。
1. 对象的嵌套引用
a = { "list": [1,2,3] }
上面的代码,在内存中是什么样子的呢?请看下图:
原来,在我们的嵌套对象中,子对象也是一个引用。
1. 浅拷贝
如上图所示,我们就可以很好的理解什么叫做浅拷贝了。
浅拷贝:只拷贝父对象,不会拷贝对象的内部的子对象。内部的子对象指向的还是同一个引用
上面 的 a 和 c 是一个独立的对象,但他们的子对象还是指向统一对象
1.1 浅拷贝的方法
.copy()
a = {"list": [1,2,3] } b = a.copy()
copy模块
import copy a = {"list": [1,2,3] } b = copy.copy(a)
列表切片[:]
a = [1,2,3,[1,2,3]] b = a[1:]
for循环
a = [1,2,3,[1,2,3]] b = [] for i in a:b.append(i)
1.2 浅拷贝的影响
a = {"list":[1,2,3]} b = a.copy() a["list"].append(4)print(a) # {'list': [1, 2, 3, 4]}print(b) # {'list': [1, 2, 3, 4]}
在上面的例子中,我们明明只改变 a 的子对象,却发现 b 的子对象也跟着改变了。这样在我们的程序中也许会引发很多的BUG。
2. 深拷贝
上面我们知道了什么是浅拷贝,那我们的深拷贝就更好理解了。
深拷贝:完全拷贝了父对象及其子对象,两者已经完成没有任何关联,是完全独立的。
import copy a = {"list":[1,2,3]} b = copy.deepcopy(a) a["list"].append(4)print(a) # {'list': [1, 2, 3, 4]}print(b) # {'list': [1, 2, 3,]}
上面的例子中,我们再次修改 a 的子对象对 b 已经没有任何影响
3. 手动实现一个深拷贝
主要采用递归的方法解决问题。判断拷贝的每一项子对象是否为引用对象。如果是就采用递归的方式将子对象进行复制。
def deepcopy(instance):if isinstance(instance, dict):return {k:deepcopy(v) for k,v in instance.items() }elif isinstance(instance, list):return [deepcopy(x) for x in instance]else:return instancea = {"list": [1,2,3]} b = deepcopy(a)print(a) # {'list': [1, 2, 3]}print(b) # {'list': [1, 2, 3]}a["list"].append(4) print(a) # {'list': [1, 2, 3, 4]}print(b) # {'list': [1, 2, 3]}
Python对象的浅拷贝与深拷贝相关推荐
- 拷贝Python对象、浅拷贝、深拷贝
浅拷贝和深拷贝在C++中出现和使用的较多,python也有相应的用法. test1 = ['a','c','b','d','f'] print id(test1) test2 = test1 prin ...
- Python —对象的浅拷贝和深拷贝
变量的赋值操作 只是形成两个变量,实际还是指向同一个对象. 浅拷贝 Python 拷贝一般都是浅拷贝(copy.copy).拷贝时,对象包含的子对象内容不拷贝.因此,源对象和拷贝对象会引用同一个子对象 ...
- 对象的浅拷贝和深拷贝
对象的浅拷贝和深拷贝 简要介绍 代码实现 简要介绍 浅拷贝:python拷贝一般都是浅拷贝.拷贝时,对象包含的子对象内容不拷贝.因此,源对象和拷贝对象引用同一个对象 深拷贝:使用copy模块的deep ...
- Python copy模块浅拷贝和深拷贝
Python copy模块浅拷贝和深拷贝 在开发中,经常涉及到数据的传递,在数据传递使用的过程中,可能会对数据进行修改. 对数据进行处理后,如果在后面的代码中,即需要使用修改之前的数据,也需要使用修改 ...
- Python中的浅拷贝和深拷贝(一看就懂!!!)
浅拷贝和深拷贝一直傻傻的分不清,甚至有时候会理解反.今天就简单总结一下python中的浅拷贝和深拷贝. 总结 最直观的理解就是: 1.深拷贝,拷贝的程度深,自己新开辟了一块内存,将被拷贝内容全部拷贝过 ...
- python中不可变对象_Python中的可变对象与不可变对象、浅拷贝与深拷贝
Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...
- Python赋值、浅拷贝、深拷贝
一.赋值(assignment) >>> a = [1, 2, 3] >>> b = a >>> print(id(a), id(b), sep= ...
- Python 赋值、浅拷贝、深拷贝的区别?
http://songlee24.github.io/2014/08/15/python-FAQ-02/ 在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出 ...
- Python——赋值、浅拷贝、深拷贝
和很多语言一样,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式. 在学习过程中,一开始对浅拷贝理解很模糊.不过经过一系列的实验后,我发现对这三者的概念有了进一步的了 ...
最新文章
- Emgu-WPF学习使用-识别二维码的位置
- aryson ms sql_数据治理:SQL数据清洗十八般武艺
- Totem-DesignNet处理器插件开发方法
- 这年头,胡萝卜也靠不住了
- css background size
- *【HDU - 2819】Swap(二分图匹配,输出路径)(待证明:是否是最少交换次数?)
- pytorch之学习率变化策略之LambdaLR
- pycharm编程工具自带python环境_PyCharm配置Python3开发环境
- php连接mysql MariaDB_PHP+MariaDB数据库操作基本技巧
- drawCircle方法:绘制圆形
- 解决M1处理器款mac安装DW闪退问题 Dreamweaver 2021 Mac(已适配M1芯片,支持最新款M1芯片Mac)
- 【数据结构初阶】:栈和队列的实现(用C语言实现,附图详解和附源码)
- 电脑睡眠后启动 耳机没有声音 手动启动 -已解决
- 第一个C编译器的诞生图
- Python第八课(函数1)
- 机器自动翻译古文拼音 - 十大宋词 - 破阵子 醉里挑灯看剑 辛弃疾
- 基于JAVA实现的幼儿园信息管理系统
- 天涯网站跨站漏洞(ALLyeSNO)
- 【Python】抓取基金数据,这简直太爱了
- MP26123DR三节串联锂电池充放电电路