python的复制,深拷贝和浅拷贝的区别

 

在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. vbs让电脑发音说话
  2. C#在Dictionary中使用枚举作为键
  3. Lazarus中system.length说明
  4. 剑指offer系列56---连续子数组的最大和
  5. Struts-2.3.24.1官方例子-struts2-blank
  6. C# 网络编程 Part.1
  7. Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION
  8. NJU 1010 Air
  9. machine learning 之 Neural Network 2
  10. 关于CSS引入方式的详细见解
  11. Oracle优化器
  12. JVM内存区域详解
  13. react 父子组件通信
  14. linq标准查询运算符
  15. PHP 小知识
  16. swiper4 一个页面多个轮播
  17. Android 模仿微信发送图片 钟罩效果
  18. BZOJ2115:[WC2011] Xor(线性基)
  19. mongodb基础学习1-基本说明及安装
  20. bzoj2594

热门文章

  1. koa/redux middleware 深入解析
  2. Nginx环境的搭建
  3. 解决SecureCRT无法用非root账号登录ssh
  4. docker镜像操作
  5. js 判断 是否在当前页面 当前页面是否在前端
  6. win32-api: 让 static 控件中的水平横行,垂直居中。
  7. python高并发的解决方案
  8. org.apache.poi 读取数字问题
  9. Python3的第一个程序
  10. WiFi热点(1):windows8建wifi虚拟热点