Python中的浅拷贝 深拷贝
浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种:
1. copy
从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列表元素同样也改变了。
可以理解为浅拷贝只改变父对象的地址空间,而子对象的地址空间不改变,这样子对象自然会受到影响,而父对象不受影响。
>>> a=[1,2,3,['a','b','c']]
>>> b=a
>>> import copy
>>> c=copy.copy(a)
>>> a.append(4)
>>> b
[1, 2, 3, ['a', 'b', 'c'], 4]
>>> c
[1, 2, 3, ['a', 'b', 'c']]
>>> a[3].append('d')
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
>>> b
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
>>> c
[1, 2, 3, ['a', 'b', 'c', 'd']]
>>>
2. list
>>> a
[100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> e=list(a)
>>> e
[100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a
[100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a[0]=200
>>> e
[100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a
[200, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a[3].remove('d')
>>> a
[200, 2, 3, ['a', 'b', 'c'], 4, 5]
>>> e
[100, 2, 3, ['a', 'b', 'c'], 4, 5]
>>> a[3]=300
>>> a
[200, 2, 3, 300, 4, 5]
>>> e
[100, 2, 3, ['a', 'b', 'c'], 4, 5]
3. 切片
>>> e=a[:]
>>> e
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> e.append(8)
>>> e
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5, 8]
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a[3].append('p')
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd', 'p'], 4, 5]
>>> e
[1, 2, 3, ['a', 'b', 'c', 'd', 'p'], 4, 5, 8]
深拷贝父对象,子对象的地址空间都改变,这样目标对象跟原始对象无论哪个改变都不会互相影响;
>>> d=copy.deepcopy(a)
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
>>> a.append(5)
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> d[3].append('e')
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd', 'e'], 4]
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> b
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
总结:
e=a 相同标签引用同一个地址空间,互相影响;
e=a[:] 或者 e=list(a) 或者 e=copy.copy(a) 均为浅拷贝,父对象互不影响,但是子对象都是引用同一个地址空间;
e=copy.deepcopy(a) 深拷贝,父对象跟子对象全部创建新的地址空间,父对象跟子对象任何元素改变都互不影响;
Python中的浅拷贝 深拷贝的更多相关文章
- python中赋值-浅拷贝-深拷贝之间的关系
赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...
- python开发_copy(浅拷贝|深拷贝)_博主推荐
在python中,有着深拷贝和浅拷贝,即copy模块 下面我们就来聊一下: 运行效果: ================================================== 代码部分: ...
- Python中复制、深拷贝和浅拷贝的区别
深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都 ...
- python中的浅拷贝与赋值不同
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- python中的浅拷贝和深拷贝
1.赋值语句 a = 'abc' b = a print id(a) print id(b) # id(a):29283464 # id(b):29283464 通过简单的复制,我们可以看到,a b其 ...
- 16.python中的浅拷贝和深拷贝
在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b
- Python中的浅拷贝与深拷贝
编者注:本文主要参考了<Python核心编程(第二版)> 以下都是参考资料后,我自己的理解,如有错误希望大家不吝赐教. 大家有没有遇到这样一种情况,对象赋值后,对其中一个变量进行修改,另外 ...
- 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)
赋值 python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间. a = 123b = a print(id(a) ...
- (转+原)python中的浅拷贝和深拷贝
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6069722.html 原网址: http://blog.csdn.net/sunshine_in_mo ...
随机推荐
- python 线程之 threading(三)
python 线程之 threading(一)http://www.cnblogs.com/someoneHan/p/6204640.html python 线程之 threading(二)http: ...
- PDA 收银系统PDA手持打印扫描枪 销售开单 收银 扫描打印一体机
在零售方面也有很好的应用.如在一些高端品牌零售店,营业员可以随身导购,一站式完成了商品销售和收银,很是受消费者追捧,符合了企业对客户体验以及行业领先的追求. PDA收银系统是一款多功能可以取代专业收银 ...
- jvm的垃圾回收原理
什么是垃圾回收? 垃圾回收是Java中自动内存管理的另一种叫法.垃圾回收的目的是为程序保持尽可能多的可用堆(heap). JVM会删除堆上不再需要从堆引用的对象. 用一个例子解释垃圾回收? 比方说,下 ...
- NOI 题库 6266
6266 取石子游戏 描述 有两堆石子,两个人轮流去取.每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍.最后谁能够把一堆石子取空谁就算赢. 比如初始的时候两堆石 ...
- 【BZOJ】3991: [SDOI2015]寻宝游戏
题意 给一个\(n\)个点带边权的树.有\(m\)次操作,每一次操作一个点\(x\),如果\(x\)已经出现,则\(x\)消失.否则\(x\)出现.每一操作后,询问从某个点开始走,直到经过所有出现的点 ...
- 【BZOJ3669】[Noi2014]魔法森林 LCT
终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...
- bzoj1720: [Usaco2006 Jan]Corral the Cows 奶牛围栏
金组题什么的都要绕个弯才能AC..不想银组套模板= = 题目大意:给n个点,求最小边长使得此正方形内的点数不少于c个 首先一看题就知道要二分边长len 本来打算用二维前缀和来判断,显然时间会爆,而且坐 ...
- iOS WKWebView的javascript alert 不弹的解决方案
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiate ...
- java beans
There are N little kids sitting in a circle, each of them are carrying some java beans in their hand ...
- 给Source Insight做个外挂系列之五--Insight “TabSiPlus”
“TabSiPlus 外挂插件”主要有两部分组成,分别是“外挂插件加载器”和“插件动态库”.“插件动态库”完成Source Insight窗口的Hook,显示Tab标签栏,截获Source Insig ...