浅copy

首先我们来看下面一段代码:

  1 >>> names = ["maqing"," peilin"," xiaoming"," lilei"," hanmeimei",["maqing","wangchuan","lilong"]]
2 >>> names2 = names.copy()
3 >>> print(names)
4 ['maqing', ' peilin', ' xiaoming', ' lilei', ' hanmeimei', ['maqing', 'wangchuan', 'lilong']]
5 >>> names[2] = "小明"
7 >>> print(names)
8 ['maqing', ' peilin', '小明', ' lilei', ' hanmeimei', ['maqing', 'wangchuan', 'lilong']]
9 >>> print(names2)
10 ['maqing', ' peilin', ' xiaoming', ' lilei', ' hanmeimei', ['maqing', 'wangchuan', 'lilong']]
11 >>> names[-1][2] = "李龙"
12 >>> print(names)
13 ['maqing', ' peilin', '小明', ' lilei', ' hanmeimei', ['maqing', 'wangchuan', '李龙']]
14 >>> print(names2)
15 ['maqing', ' peilin', ' xiaoming', ' lilei', ' hanmeimei', ['maqing', 'wangchuan', '李龙']]

第一步:修改names中'xiaoming'的值为中文"小明",输出列表发现只有names中修改了,但names2中没有修改,符合copy的性质。

第二步:修改names中二级列表"lilong"的值为"李龙",输出names和names2,我们发现'lilong'的值都改为中文了,貌似这不符合copy的性质。

这种copy我们称之为浅copy

浅copy的方法有三种:

  • 使用切片[:]操作
  • 使用工厂函数(如list/dir/set)
  • 使用copy模块中的copy()函数
 person = ['name',['saving',100]]
p1 = copy.copy(person)
p2 = person[:]
p3 = list(person)

深copy

 >>> import copy
>>> names = ["Will", 28, ["Python", "C#", "JavaScript"]]
>>> names2 = copy.deepcopy(names)
>>> names[1] = ''
>>> print(names)
['Will', '', ['Python', 'C#', 'JavaScript']]
>>> print(names2)
['Will', 28, ['Python', 'C#', 'JavaScript']]
>>> names[2][1] = "Ruby"
>>> print(names)
['Will', '', ['Python', 'Ruby', 'JavaScript']]
>>> print(names2)
['Will', 28, ['Python', 'C#', 'JavaScript']]

总结

本文介绍了对象的赋值和拷贝,以及它们之间的差异:

  • Python中对象的赋值都是进行对象引用(内存地址)传递
  • 使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
  • 如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
  • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有被拷贝一说
  • 如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子

   

最新文章

  1. MySQL入门01-MySQL源码安装
  2. poj 1003 (nyoj 156) Hangover
  3. Spring之@Configuration配置解析
  4. react-native 的微信SDK辅助包,支持微信登录、微信分享、微信支付
  5. 线段树好题(2004集训队林涛PPT中的3题)
  6. 个人电脑配置FTP服务器,四张图搞定。项目需要,并自己写了个客户端实现下载和上传的功能!
  7. ###《Effective STL》--Chapter3
  8. 经常使用虚拟现实仿真软件总汇(zz)
  9. 解决error:could not open ...jvm.cfg
  10. VC++深入详解读书笔记-第六章菜单
  11. linux下串口的阻塞和非阻塞操作
  12. 关于JS变量和作用域
  13. JDNI
  14. hibernate实体类型映射文件
  15. 关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。
  16. 391.FANUC宏程序编程
  17. Exp2后门原理与实践 20164312马孝涛
  18. kubernetes调度pod运行于master节点上
  19. 施密特正交化 GramSchmidt
  20. git与github工具使用

热门文章

  1. 斯坦福机器学习视频笔记 Week7 支持向量机 Support Vector Machines
  2. java instrumentation &JVMTI
  3. 【简单dp】poj 1458 最长公共子序列【O(n^2)】【模板】
  4. Springmvc跳转路径
  5. P2610 【[ZJOI2012]旅游】(dfs+树的直径)
  6. 泛型学习第一天:List与IList的区别 (一)
  7. Kafka详解四:Kafka的设计思想、理念
  8. MYSQL进阶学习笔记一:MySQL编码设定,会话变量和全局变量!(视频序号:进阶_1-3)
  9. eclipse下进行c开发,使用zeromq
  10. SQL之merge into(转)