python学习笔记--深拷贝与浅拷贝的区别
首先我们来讲讲我们python中的可变对象和不可变对象:
可变对象:该对象指向内存中的值是可以改变的。实际上是其所指的值直接发生改变,而不是发生复制,或者开辟一个新的地址空间。例如:列表list,字典dict,集合set。
不可变对象:该对象所指向的内存中的值是不能被改变的。当改变一个变量时,由于其所指的值不能被改变,相当于把原来的值复制一份到新开辟的地址,再进行改变,并将变量指向这个新的地址空间。例如:数值类型(int、float)、字符串str、元组tuple。
python中对象的赋值实际上是对象的引用,例如:
a = [1,2,3]
实际上在电脑内部是生成一个地址将list[1,2,3]
放在这个地址,在赋值给a时,就是讲a指向了这个地址。如果此时我们再执行 a = [4,5,6]
,并不是说在我们的内存中[1,2,3]
就不存在了,这个列表是一直存在的,只是我们将变量a指向了一个新的列表的地址。
- 下面我们讲讲浅拷贝(包含可变对象:此处可变为中间的list对象):
>>> alist=[1,2,3,["a","b"]]
>>> b = alist
>>>print b
[1,2,3,['a','b']]
>>> alist.append(5)
>>>print alist
[1,2,3,['a','b'],5]
>>>print b
[1,2,3,['a','b'],5]
在这个程序块中,当我们执行alist.append(5)
实际上改变的是alist这个变量指向的list,由于我们的变量b也是指向这个list,所以变量b的值也跟着改变。
- copy.copy()浅拷贝
这个copy.copy没有拷贝可变对象,即当可变对象发生变化时,所有的变量都会跟着发生变化。
例如:
>>>import copy
>>> c=copy.copy(alist)
>>>print alist;print c
[1,2,3,['a','b']]
[1,2,3,['a','b']]
>>> alist.append(5)
>>>print alist;print c
[1,2,3,['a','b'],5]
[1,2,3,['a','b']]
>>> alist[3]
['a','b']#这个对象是可变对象
>>> alist[3].append('cccc')
>>>print alist;print c
[1,2,3,['a','b','cccc'],5]
[1,2,3,['a','b','cccc']]
- copy.deepcopy拷贝了包含可变对象在内的所有对象
>>>import copy
>>> d=copy.deepcopy(alist)#此时d和alist是两个完全独立的对象
>>>print alist;print d
[1,2,3,['a','b']]
[1,2,3,['a','b']]始终没有改变
>>> alist.append(5)
>>>print alist;print d
[1,2,3,['a','b'],5]
[1,2,3,['a','b']]始终没有改变
>>> alist[3]
['a','b']
>>> alist[3].append("ccccc")
>>>print alist;print d
[1,2,3,['a','b','ccccc'],5]
[1,2,3,['a','b']]始终没有改变
python学习笔记--深拷贝与浅拷贝的区别的更多相关文章
- Python赋值语句与深拷贝、浅拷贝的区别
参考:http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-d ...
- python学习笔记七:浅拷贝深拷贝
原理 浅拷贝 import copy b = copy.copy(a) demo: >>> a=[1,['a']] >>> b=a >>> c=c ...
- python赋值,深拷贝和浅拷贝的区别
1.赋值 list1=[[1,2],'fei',66] list2=list1 list1 [[1, 2], 'fei', 66] list2 [[1, 2], 'fei', 66] list2.ap ...
- ES6-11学习笔记--深拷贝与浅拷贝
Object.assign,只是进行了浅拷贝,并没有进行深拷贝. 而且会在复杂结构当中会丢失属性,如下代码: let target = { a: { b: { c: 3 }, e: 4, f: 5, ...
- Python 深拷贝和浅拷贝的区别
python的复制,深拷贝和浅拷贝的区别 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 ...
- python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹
python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...
- Python学习笔记(七)
Python学习笔记(七): 深浅拷贝 Set-集合 函数 1. 深浅拷贝 1. 浅拷贝-多层嵌套只拷贝第一层 a = [[1,2],3,4] b = a.copy() print(b) # 结果:[ ...
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
随机推荐
- 快学Scala习题解答—第十章 特质
10 特质 10.1 java.awt.Rectangle类有两个非常实用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这种类没有. 在Scala中,你 ...
- 关于EditText的android:maxLength属性的注意事项
一直以为在xml布局文件中对EditText添加 android:maxLength="30";属性是控制EditText字符数的.想当然的以为一个中文占2个字符,一个英文占1个字 ...
- RDA 字库制作
制作韩语字库为例: 1.韩语UNICODE 范围 TV_IDF_uni_korean.txt [01fa,] [02c6,02c7] [02c9,02ca] [02cd,02cd] [02d8,02d ...
- JSP-Runoob:JSP 链接数据库
ylbtech-JSP-Runoob:JSP 链接数据库 1.返回顶部 1. JSP 连接数据库 本教程假定您已经了解了 JDBC 应用程序的工作方式.在您开始学习 JSP 数据库访问之前,请访问 J ...
- 使用centos 5.x 32位系统安装astgo 2014 v7.0教程(含全套安装文件)
版本特色: 全自动安装 安装过程中不用频繁输入yes或回车 自带完整号码归属地数据库 自带触屏版WAP ·首先确定你需要使用astgo 2014 7.0还是7.3: astgo 2014 v 7.0 ...
- PCB genesis 大孔扩孔(不用G84命令)实现方法
PCB钻孔时,当钻刀>6.3mm时,超出钻孔范围,钻孔工序是没有这么大的钻刀,当这种情况,工程CAM会都采用G84命令用小孔扩孔的方式制作, 在这里介绍一种如果不用G84命令,用程序实现将大孔生 ...
- Java常用的数组排序算法(面试宝典)
这段时间有些忙,今天空闲出来给大家分享下Java中常用的数组排序算,有冒泡排序.快速排序.选择排序.插入排序.希尔算法.并归排序算法.堆排序算法,以上排序算法中,前面几种相对后面的比较容易理解一些.下 ...
- HTML--文本域,支持多行文本输入
当用户需要在表单中输入大段文字时,需要用到文本输入域. 语法: <textarea rows="行数" cols="列数">文本</texta ...
- CTSC+APIO+THUACM游记
退役之前,写点破事乐呵乐呵.. (同DaD3zZ) CTSC Day0 来到丽都 哈哈哈这可是四星级豪华酒店啊 想想要在这住7天 美滋滋 换了半天的房间 也没有换到一起 最后yzy& ...
- CF830A/831D Office Keys
思路: 问题的关键在于对钥匙按照位置排序之后,最终选择的n个钥匙一定是其中的一个连续的区间. 实现: #include <iostream> #include <cstdio> ...