六.深浅copy
2024-09-05 13:53:27
先问问大家,什么是拷贝?拷贝是音译的词,其实他是从copy这个英文单词音译过来的,那什么是copy? copy其实就是复制一份,也就是所谓的抄一份。深浅copy其实就是完全复制一份,和部分复制一份的意思。
1,先看赋值运算。
l1 = [1,2,3,['barry','alex']]
l2 = l1 l1[0] = 111
print(l1) # [111, 2, 3, ['barry', 'alex']]
print(l2) # [111, 2, 3, ['barry', 'alex']] l1[3][0] = 'wusir'
print(l1) # [111, 2, 3, ['wusir', 'alex']]
print(l2) # [111, 2, 3, ['wusir', 'alex']]
对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的,在举个例子,比如张三李四合租在一起,那么对于客厅来说,他们是公用的,张三可以用,李四也可以用,但是突然有一天张三把客厅的的电视换成投影了,那么李四使用客厅时,想看电视没有了,而是投影了,对吧?l1,l2指向的是同一个列表,任何一个变量对列表进行改变,剩下那个变量在使用列表之后,这个列表就是发生改变之后的列表。
2,浅拷贝copy。
#同一代码块下:
l1 = [1, '太白', True, (1,2,3), [22, 33]]
l2 = l1.copy()
print(id(l1), id(l2)) # 2713214468360 2713214524680
print(id(l1[-2]), id(l2[-2])) # 2547618888008 2547618888008
print(id(l1[-1]),id(l2[-1])) # 2547620322952 2547620322952 # 不同代码块下:
>>> l1 = [1, '太白', True, (1, 2, 3), [22, 33]]
>>> l2 = l1.copy()
>>> print(id(l1), id(l2))
1477183162120 1477183162696
>>> print(id(l1[-2]), id(l2[-2]))
1477181814032 1477181814032
>>> print(id(l1[-1]), id(l2[-1]))
1477183162504 1477183162504
对于浅copy来说,只是在内存中重新创建了开辟了一个空间存放一个新列表,但是新列表中的元素与原列表中的元素是公用的。
3,深拷贝deepcopy。
# 同一代码块下
import copy
l1 = [1, 'alex', True, (1,2,3), [22, 33]]
l2 = copy.deepcopy(l1)
print(id(l1), id(l2)) # 2788324482440 2788324483016
print(id(l1[0]),id(l2[0])) # 1470562768 1470562768
print(id(l1[-1]),id(l2[-1])) # 2788324482632 2788324482696
print(id(l1[-2]),id(l2[-2])) # 2788323047752 2788323047752 # 不同代码块下
>>> import copy
>>> l1 = [1, '太白', True, (1, 2, 3), [22, 33]]
>>> l2 = copy.deepcopy(l1)
>>> print(id(l1), id(l2))
1477183162824 1477183162632
>>> print(id(0), id(0))
1470562736 1470562736
>>> print(id(-2), id(-2))
1470562672 1470562672
>>> print(id(l1[-1]), id(l2[-1]))
1477183162120 1477183162312
对于深copy来说,列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的。
l1 = [1, 2, 3, 4, ['alex']]
l2 = l1[::]
l1[-1].append(666)
print(l2)
最新文章
- C/C++构建系统 -工具汇总
- 后台向前台传递entity的list然后构筑combobox的方法(easyui)
- zend studio 9实用快捷键大全 分享ZEND STUDIO 9的常用快捷键,高亮显示相同变量。
- 文件夹工具类 - FolderUtils
- uiautomatorviewer 识别android微信元素报错
- [Tree]Count Complete Tree Nodes
- Web常用函数介绍(LoadRunner相关)
- GOLang(数组操作随篇)
- 社群系统ThinkSNS + 移动端研发周报
- Head First设计模式之单例模式
- Linux文件系统选择
- php上传文件配置
- personal project
- ubuntu14.04+MatlabR2014a+caffe
- 让硬盘灯不再狂闪,调整Win7系统绝技(转)
- BAT调用7z压缩程序
- Maximum repetition substring POJ - 3693(重复次数最多的连续重复子串)
- Diablo 3 Web API
- 初涉RxAndroid结合Glide实现多图片载入操作
- 【loj2319】[NOIP2017]列队 Splay(卡过)
热门文章
- 重置 Macbook 登录密码
- Akka-CQRS(9)- gRPC,实现前端设备与平台系统的高效集成
- java转换编码报错java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern
- 相似文档查找算法之 simHash及其 java 实现
- springboot 接口参数校验
- Mybatis中使用association进行关联的几种方式
- dede自定义内容模型下,列表只显示10条的问题及解决方法
- 三星手机使用应用沙盒一键修改路由mac数据
- VMware 设置虚拟机Centos 上网的两种方式
- 爬虫之scrapy框架应用selenium