python的复制,深拷贝和浅拷贝的区别(转)
在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用
一般有三种方法,
alist=[
1
,
2
,
3
,[
"a"
,
"b"
]]
(1)直接赋值,传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
>>> b=list
>>> print b
[1, 2, 3, ['a', 'b']]
>>> list.append(5)
>>> alist=[1,2,3,["a","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']] 始终没有改变
最新文章
- TCP通信
- ionic常用的命令
- win7下安装openpyxl
- Android应用中菜单(Menu)的位置显示问题
- 标签navtab
- IOS9适配 MARK
- ajax 传参 乱码问题
- struts2的java文件中不能直接弹出script对话框
- 微博API怎么爬取其它未授权用户的微博/怎么爬取指定用户公布的微博
- JavaEE(2) - Weblogic 服务器执行JNDI绑定和查找
- 【jsp 练习】 给定三角形三边判断是否能组成三角形及计算面积
- c3p0连接池的使用
- WebWorker实战使用
- 输入和输出--java序列化机制
- Redis数据库之概念与创建服务
- 1228.Poor Pigs 可怜的猪
- linux中VI编写C程序。。。
- bash多进程
- Linux内核“问题门” - 学习问题、经验集锦
- 关于Javascript判断变量是否为空
热门文章
- Lua学习笔记(5): 表
- [network]交换机中用户权限
- Parcel 打包器简单使用记录
- HP VC模块Shared uplink Sets配置参考
- ASP.NET Web API - 使用 Castle Windsor 依赖注入
- 网易客户端授权密码,errormsg='authentication failed (method LOGIN)' exitcode=EX_NOPERM
- 3D打印产业链全景图
- Alpha发布——视频博客
- C++总结作业
- 0330复利计算java版