先问问大家,什么是拷贝?拷贝是音译的词,其实他是从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)

最新文章

  1. C/C++构建系统 -工具汇总
  2. 后台向前台传递entity的list然后构筑combobox的方法(easyui)
  3. zend studio 9实用快捷键大全 分享ZEND STUDIO 9的常用快捷键,高亮显示相同变量。
  4. 文件夹工具类 - FolderUtils
  5. uiautomatorviewer 识别android微信元素报错
  6. [Tree]Count Complete Tree Nodes
  7. Web常用函数介绍(LoadRunner相关)
  8. GOLang(数组操作随篇)
  9. 社群系统ThinkSNS + 移动端研发周报
  10. Head First设计模式之单例模式
  11. Linux文件系统选择
  12. php上传文件配置
  13. personal project
  14. ubuntu14.04+MatlabR2014a+caffe
  15. 让硬盘灯不再狂闪,调整Win7系统绝技(转)
  16. BAT调用7z压缩程序
  17. Maximum repetition substring POJ - 3693(重复次数最多的连续重复子串)
  18. Diablo 3 Web API
  19. 初涉RxAndroid结合Glide实现多图片载入操作
  20. 【loj2319】[NOIP2017]列队 Splay(卡过)

热门文章

  1. 重置 Macbook 登录密码
  2. Akka-CQRS(9)- gRPC,实现前端设备与平台系统的高效集成
  3. java转换编码报错java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern
  4. 相似文档查找算法之 simHash及其 java 实现
  5. springboot 接口参数校验
  6. Mybatis中使用association进行关联的几种方式
  7. dede自定义内容模型下,列表只显示10条的问题及解决方法
  8. 三星手机使用应用沙盒一键修改路由mac数据
  9. VMware 设置虚拟机Centos 上网的两种方式
  10. 爬虫之scrapy框架应用selenium