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做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
随机推荐
- MyReport报表系统v1.2公布
经过多月奋战.MyReport报表系统最终完好,里程碑版本号V1.2隆重公布. 系统介绍 MyReport报表系统是基于MyReport报表引擎构建的报表开发工具平台产品.用户可以高速搭建报表中心,实 ...
- pat-1087【最短路径】
近期一次pat考试中的最后一题.事实上玩算法这东西就像打魔兽.不能光有思想上的高度,微操必须实打实.就这么个迪杰斯特拉算法.多少教科书上都讲烂了. 可是现场又有多少人是敲对的呢?不能光停留在理解上.必 ...
- 解决无线网卡 RTL8723BE ubuntu环境下不稳定情况
jiqing@ThinkPad:~$ lspci | grep -i net 00:19.0 Ethernet controller: Intel Corporation Ethernet Conne ...
- js如何获取某id的子标签
思路:根据id获取父对象,然后使用childNodes获取所有子对象数组,关键代码: document.getElementById(div_id).childNodes; // 子对象数组 实例 ...
- bzoj 3721 Final Bazarek
题目大意: n个数 选k个使和为奇数且最大 思路: 可以先将这n个数排序 然后先去最大的k个数 若和为奇数则直接输出 为偶数可以用没选的最大的奇数替换选了的最小的偶数或用没选的最大的偶数替换选了的最小 ...
- 【BZOJ 3032】 七夕祭
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3032 [算法] 交换左右两个相邻格子的摊点,不会改变这一行的摊点个数 交换上下两个相 ...
- [luogu_U15118]萨塔尼亚的期末考试
https://zybuluo.com/ysner/note/1239615 题面 \(T\)次询问,求出\[\sum_{i=1}^n\frac{i}{\frac{n(n+1)}{2}}fib_i\] ...
- bzoj 2093 [ Poi 2010 ] Frog —— 滑动窗口 + 倍增
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2093 先处理出每个点第一次会跳到哪里: 开一个长度为 K+1 的窗口(因为第一近的实际是自己 ...
- vue单页面应用刷新网页后vuex的state数据丢失问题以及beforeunload的兼容性
最近在用vue写h5项目,当使用window.location重定向页面或者刷新当前页面时, 发现当刷新网页后,保存在vuex实例store里的数据会丢失. 后来在网上查找大神的解决方案如下: exp ...
- Linux必知必会的目录结构
1.目录结构 /bin 二进制文件 命令 /sbin 超级命令 只有root用户可以使用 /boot 系统的引导文件 系统内核 /dev 设备文件 光盘 硬盘分区 /etc 系统配置文件 /home ...