Python直接赋值,浅copy和深copy的比较

  基于引用和对象(python引用和对象分离)

总结:

  直接赋值:a = b --》a,b两个引用指向相同的对象
  浅copy:a为b的copy --》 copy(新建)b的不可变子对象,共用可变子对象
  深copy:a为b的深copy--》copy(新建)b的所有子对象,两者对象无关联
  

ps:对象的值相等,内存地址不一定相同(小数据池)
 
详细解析如下:
 

在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用

一般有三种方法,

alist=[1,2,3,["a","b"]]

(1)直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变

>>> b=alist
>>> print b
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print b
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]

(2)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']] 里面的子对象被改变了

(3)深拷贝,包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

>>> import copy

>>> d=copy.deepcopy(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']]  始终没有改变

 
 
参考博客:https://www.cnblogs.com/xueli/p/4952063.html
 

最新文章

  1. (转)awk实例练习(二)
  2. BZOJ3226: [Sdoi2008]校门外的区间
  3. a byte of python (摘01)
  4. POJ2396_Budget
  5. .net框架版本说明
  6. java前端选择
  7. nginx 请求负载 转发规则设置
  8. javascript 多图无缝切换
  9. a web-based music player(GO + html5)
  10. linux vi编辑常用命令
  11. electron的艰难安装之旅
  12. mysql数据库中间件研究
  13. leetcode刷题第二天<两数相加>
  14. https学习笔记二----基础密码学知识和python pycrypto库的介绍使用
  15. 【golang】kafka
  16. 斐波那契数列中获取第n个数据值
  17. springmvc实现文件上传
  18. React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: undefined.
  19. SpringBoot 项目中使用velocity模板(转载)
  20. Java内存模型简析

热门文章

  1. 转: CentOS上安装LAMP之第一步:Apache环境及安装过程报错解决方案(纯净系统环境)
  2. 如何把pdf文档转化为word
  3. JS---案例:手风琴 (利用封装好的动画函数)
  4. string型的“600.000”如何转换为int型
  5. Serializable 可串行化接口
  6. NFS客户端挂载目录后无写入权限的解决方案
  7. OWIN启动类检测
  8. vue2.0 兼容ie9及其以上
  9. Python之collection
  10. python 字符串匹配算法设计