(五)聊一聊深Copy与浅Copy

一、关于浅copy与深copy

首先说明一下:

在python中,赋值其实就是对象的引用,变量就是对象的一个标签,如果把内存对象比喻成一个个房间,那么变量就是门牌号。

深copy与浅copy只是针对可变类型而言,对于不可变类型,无论深浅,值相等,内存地址一样,一旦值发生变化,相当于再创建一个对象。

浅copy有3种方法:

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

a1=a[:]  切片操作

a2=list(a)  工厂函数

a3=copy.copy(a)  或 a3=a.copy()  用copy方法

深copy:

deepcopy()方法

具体见代码:

 1 import copy
 2 a=[1,2,["a","b","c"],22,34]
 3 b=a #相当于一个内存地址赋予两个标签a和b而已,其实a就是b,b就是a
 4 print(id(a),id(b),a is b)
 5 #id:2828862838856 2828862838856 返回True
 6 b1=a[:]#切片拷贝,值相等,id不同,两个内存对象
 7 print(id(b1),id(a),a is b1,id(b1[0]),id(a[0]),sep="\n")
 8 #id:1811258826056 1811258824776 返回False
 9 #子对象地址一样:1990094304  1990094304
10 b2=list(a)  #工厂函数
11 print(id(b2),id(a))
12 b3=copy.copy(a)
13 b4=a.copy()
14 print(id(b3))
15 a[0]=99
16 print(id(a[0]),id(b1[0]))
17 a[2][0]="a1" #只要根中某一层子元素改变,浅copy的对象就会就改变
18 print(a,b1,b2,b3,sep="\n")
19 a[2][0]="d"
20 d=copy.deepcopy(a)
21 print(d,a) #完全独立于a
22 #[99, 2, [‘d‘, ‘b‘, ‘c‘], 22, 34]   [99, 2, [‘d‘, ‘b‘, ‘c‘], 22, 34]

总结:

1、赋值:简单地拷贝对象的引用,两个对象的id相同。

2、浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象,还存在关联。

3、深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。

浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。

作用:深拷贝相当于备份一份

原文地址:https://www.cnblogs.com/Mr-wx/p/8453646.html

时间: 2024-10-09 07:43:23

(五)聊一聊深Copy与浅Copy的相关文章

python中的深copy和浅copy

bytes Python bytes/str bytes 在Python3中作为一种单独的数据类型,不能拼接,不能拼接,不能拼接 >>> '€20'.encode('utf-8') b'\xe2\x82\xac20' >>> b'\xe2\x82\xac20'.decode('utf-8') '€20' 解码 >>> b'\xa420'.decode('windows-1255') '?20' 深copy和浅copy 深copy新建一个对象重新分配内存

列表的使用2,深COPY和浅COPY,循环列表,步长切片

name2=names.copy() 下面我看几种奇怪的现象: 首先把源列表copy以后,把源列表第2个数值修改.那么没毛病. 如果源列表里,还包含了一个子列表:这也没毛病 如果我们这个时候修改子列表的数值.我们来看一个神奇的现象: copy是一种浅COPY,它只会COPY第一层的数据,而不会深入COPY.只会COPY子列表的内存指针,内存地址. 如果你不用COPY的方法,那问题会更严重: 结果是这样的,连浅COPY都不如:相当于只把列表的内存地址复制了一下: 简单来说就是这种情况. 但是如果是

关于iOS的深copy和浅copy 以及copy 和 strong 的区别

之前都是靠记忆来维持copy和strong  也有问过我 .  我自己说起来才感觉都说不很清楚 通过简单都代码来验证一下 . 有时候花点时间验证一下才能让思路更加清晰 NSMutableString * mustr = [NSMutableString stringWithString:@"good"]; self.str = mustr; self.fuzhiString = mustr; NSLog(@"self.str is (%@) ==== str,self.fuz

深浅copy,何为深浅copy,深copy和浅copy两者有何不同

copy,拷贝,顾名思义,自然是把东西复制过来,呈现在眼前的是一样的,例如: a = [1,2,3,4,5] b = a b.append(6) print(a,b) 输出: [1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6] 很明显,a和b的值是一样的.因为对于赋值运算来讲,a与b指向的是同一内存地址,所以他们完全是一样的 浅copy: a = [1,2,3,4,[5]] b = copy.copy(a) b[4].append(6) print(a) print(b)

python深copy与浅copy的区别

首先先看一段代码 import copy a = [1, 2, 3, [4]] b = a c = a.copy() d = copy.deepcopy(a) e = copy.copy(a) a.append(4) a[3].append(5) print('a值为 {} 地址为 {}'.format(a, id(a))) print('b值为 {} 地址为 {}'.format(b, id(b))) print('c值为 {} 地址为 {}'.format(c, id(c))) print(

深copy及浅copy的对比

转自 http://python.jobbole.com/82294/ Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 will = ["Will", 28, ["Python", "C#", "Ja

深copy和浅copy

字符串与复杂数据结构存入内存的差异 1.str的赋值             2.复杂的数据结构中的赋值          

python 深复制与浅复制------copy模块

模块解读: 浅复制: x = copy.copy(y)深复制: x = copy.deepcopy(y)(注:模块特有的异常,copy.Error) 深copy与浅copy的差别主要体现在当有混合对象时,即在一个对象中包含其他子对象,比如在一个字典中的一个value是一个列表,这时:浅copy,没有拷贝子对象,所以原始数据改变,子对象会跟着改变.深copy,包含拷贝对象中对子对象的拷贝,也就是说原始数据改变,子对象不会随之改变. 举个例子:info = { 'name':'webber', 'j

浅copy与深copy

浅copy 实现浅copy的几种方式: 1 import copy 2 3 name1=['Liyunlong',['alex','Tony'],'Xuliucheng'] 4 5 name2=copy.copy(name1) 6 name2=name1[:] 7 name2=name1.copy() 实现深copy的方式: 1 import copy 2 3 name1=['Liyunlong',['alex','Tony'],'Xuliucheng'] 4 5 name2=copy.deep