博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python列表中的深浅copy
阅读量:6426 次
发布时间:2019-06-23

本文共 2003 字,大约阅读时间需要 6 分钟。

列表中的赋值和平常的赋值是不一样的,看下面的代码:
In [1]: a = 1 In [2]: b = a In [3]: aOut[3]: 1 In [4]: bOut[4]: 1 In [5]: id(a)Out[5]: 4452948992 In [6]: id(b)Out[6]: 4452948992 In [7]: id(1)Out[7]: 4452948992 In [8]: a = 4 In [9]: bOut[9]: 1 In [10]: id(a)Out[10]: 4452949088 In [11]: id(b)Out[11]: 4452948992 In [12]: id(1)Out[12]: 4452948992
在这段代码中,a = 1,a指向内存地址;b = a,b也指向内存地址1,所以当a指向内存地址4的时候,b的值不变,因为b指向的内存地址是1而不是a。
在列表中就不一样了,下面介绍列表的深浅copy
 
1.直接赋值
In [1]: li = [1,2,3] In [2]: n = li In [3]: liOut[3]: [1, 2, 3] In [4]: nOut[4]: [1, 2, 3] In [5]: li[0] = 'a' In [6]: liOut[6]: ['a', 2, 3] In [7]: nOut[7]: ['a', 2, 3] In [8]: id(li)Out[8]: 4342626376 In [9]: id(n)Out[9]: 4342626376 In [10]: id([1,2,3])Out[10]: 4440762824
可以看出,在列表中,n是指向了li的内存地址, 不是列表[1,2,3]了,所以li的值变化的话,n也跟着变化。可以想象成li和n都指向了一个水杯,水杯里有三块白糖,把其中一块换成了黑糖, 那不管是用li还是n,水杯里现在都是有两块白糖和一块黑糖。 2.浅copy
In [1]: li2 = [1,2,3,['alex',27]] In [2]: n2 = li2.copy() In [3]: li2Out[3]: [1, 2, 3, ['alex', 27]] In [4]: n2Out[4]: [1, 2, 3, ['alex', 27]] In [5]: id(li2),id(n2)Out[6]: (4536317192, 4536271560) In [6]: li2[0] = 'a' In [7]: li2Out[7]: ['a', 2, 3, ['alex', 27]] In [8]: n2Out[8]: [1, 2, 3, ['alex', 27]] In [9]: id(li2[0]),id(n2[0])Out[9]: (4509371784, 4506651648)
两个列表的内存地址(id)是不一样的,说明n2重新开辟了一片内存,所以当li2里面的元素改变后,n2里的元素并没有改变。
下面就不一样了
In [10]: li2[3][0] = '帅哥' In [11]: li2Out[11]: ['a', 2, 3, ['帅哥', 27]] In [12]: n2Out[12]: [1, 2, 3, ['帅哥', 27]] In [13]: id(li2[3]),id(n2[3])Out[13]: (4536316872, 4536316872) In [15]: id(li2[3][0])Out[15]: 4536362680    # 和li2[3]的内存地址不一样
li2[3]和n2[3]的内存地址是一样的,还是共享一个内存地址,所以一个跟着改变,另一个也会跟着变,要想解决这个问题就要用到深copy了
 
4.深copy(不太常用)
In [1]: import copy In [2]: li3 = [1,2,3,['alex',27]] In [3]: n3 = copy.deepcopy(li3) In [4]: li3Out[4]: [1, 2, 3, ['alex', 27]] In [5]: n3Out[5]: [1, 2, 3, ['alex', 27]] In [6]: li3[3][0] = '帅哥' In [7]: li3Out[7]: [1, 2, 3, ['帅哥', 27]] In [8]: n3Out[8]: [1, 2, 3, ['alex', 27]]
可以看出,等于是完全copy了一份,除非特殊场景这个方法不常用,也不建议用,因为如果列表存的数据量特别大的话,这样深copy一份直接翻一倍,浪费空间。

 

 

 

 

转载于:https://www.cnblogs.com/lshedward/p/9912081.html

你可能感兴趣的文章
推荐5款超实用的.NET性能分析工具 转
查看>>
linux命令
查看>>
hash 哈希查找复杂度为什么这么低?
查看>>
线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations
查看>>
P2216 [HAOI2007]理想的正方形
查看>>
JS-利用ajax获取json数据,并传入页面生成动态tab
查看>>
解决Windows域管理的几个经典问题
查看>>
springboot+layui+springMVC+mybatis的图片上传
查看>>
Dynamic CRM多语言的安装和配置
查看>>
R-变量
查看>>
【转】Netty那点事(四)Netty与Reactor模式
查看>>
json转换
查看>>
ggplot笔记002——qplot()函数
查看>>
python3中的urllib.parse的常用方法
查看>>
记录一次事故
查看>>
ahjesus使用T4模板自动维护实体
查看>>
获取某文件夹下所有文件名、文件夹名、后缀名
查看>>
Mysql之多源复制
查看>>
[LeetCode系列]爬梯问题的递归解法转换为迭代解法
查看>>
centos7如何关闭防火墙
查看>>