聊一聊深Copy与浅Copy

Posted Mr_Xia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊一聊深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]
View Code

总结:

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

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

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

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

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

以上是关于聊一聊深Copy与浅Copy的主要内容,如果未能解决你的问题,请参考以下文章

深copy与浅copy

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

python(41):copy拷贝(深拷贝deepcopy与浅拷贝copy)

Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)