python 深拷贝与浅拷贝

浅拷贝
浅拷贝是对一个对象的顶层拷贝,即可以理解为:拷贝了引用,并没有拷贝内容
例:

a = [1,2,3,4]
b=a
id(a)
2062999779784
id(b)
2062999779784

深拷贝
顾名思义,深层次的拷贝,深拷贝不仅仅拷贝引用,还会将整个拷贝内容复制到一片新的内存区域。

例:

import copy
c=copy.deepcopy(a)
id(c)
2062999779016
id(a)
2062999779784

会发现深拷贝会另外开辟储存空间(id不同)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
当我们对a列表进行修改时:

a.append(5)
a
[1, 2, 3, 4, 5]
b
[1, 2, 3, 4, 5]
c
[1, 2, 3, 4]

此时,因为b为浅拷贝,与列表a指向同一片内存空间,所以一旦列表a改动,列表b也随之改动
但列表c为深拷贝,已经有自己独立的内存区域,所以不会改动
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【注】当我们利用深拷贝来拷贝一些列表的引用时,会进行依次拷贝(递归拷贝),即将引用的内容依次拷贝出来
例:

a = [1,2,3,4]
b = [9,8,7,6]
c = [a,b]
d = c
e = copy.deepcopy(c)
id(c)
2062999779144
id(d)
2062999779144
id(e)
2062999780296
#改变列表c中的列表a
a.append(5)
c
[[1, 2, 3, 4, 5], [9, 8, 7, 6]]
d
[[1, 2, 3, 4, 5], [9, 8, 7, 6]]
e
[[1, 2, 3, 4], [9, 8, 7, 6]]

浅拷贝的列表 d 会随着列表c中子列表的更改而变化
深拷贝的列表 e 不会改变
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++我们再来看一种:
copy.copy
例:

#接上文程序继续
f = copy.copy(c)
#对子列表a进行操作
a.insert(0,0)
c
[[0, 1, 2, 3, 4, 5], [9, 8, 7, 6]]
d
[[0, 1, 2, 3, 4, 5], [9, 8, 7, 6]]
f
[[0, 1, 2, 3, 4, 5], [9, 8, 7, 6]]
#接下来再看地址
id(c)
2062999779144
id(d)
2062999779144
id(f)
2062999779784
#对列表 c 进行操作
c.append(1)
c
[[0, 1, 2, 3, 4, 5], [9, 8, 7, 6], 1]
d
[[0, 1, 2, 3, 4, 5], [9, 8, 7, 6], 1]
f
[[0, 1, 2, 3, 4, 5], [9, 8, 7, 6]]

所以,我们会发现,当我们进行copy.copy操作时,会深拷贝当前列表,但是子列表仍然是浅拷贝。所以copy.copy只进行一层深拷贝。

我们刚刚进行的操作全都是在列表中进行的,下面我们换用元组来进行。
例:

 a = [1,2,3]
 b = [4,5,6]
 c = (a,b)
 d = copy.copy(c)
 id(c)
 2063002420488
 id(d)
 2063002420488
 a.append(4)
 c[0]
 [1, 2, 3, 4]
 d[0]
 [1, 2, 3, 4]

由程序可以发现,我们进行 copy.copy 功能的时候,当我们拷贝的是一个元组,则该操作与浅拷贝相同,这是因为 copy.copy 会自动判断数据是可变类型还是不可变类型,根据不同的数据类型进行不同的处理方式。

猜你喜欢

转载自blog.csdn.net/IWTK_wcl/article/details/84187683