Python的深拷贝和浅拷贝

 
 

                             Python 深拷贝和浅拷贝

在Python中,万物皆对象。给这个对象赋值给一个变量时,不同于C语言,python是将其添加了一个引用。

那么python的拷贝分为两种,一种为深拷贝,一种为浅拷贝。那么这两种拷贝有什么区别呢?

拷贝的实质

python的浅拷贝是对其对象引用的拷贝,并没有将其引用的对象内容进行拷贝, 只是增加了这个对象的引用计数,数据内容会被共享。

python的深拷贝是对其引用的内容的拷贝,其引用的地址也会不同,数据内容不会被共享。

深拷贝需要导入 copy模块,而深拷贝还有两种不同的拷贝:

深拷贝的copy,只是对其地址的拷贝,其地址内容的元素和浅拷贝一样只是拷贝了地址的引用,一旦修改这个元素,都会发生更改。

深拷贝的deepcopy 是对其地址内容的拷贝以及元素的地址完全拷贝,内容都不会进行共享。

代码理解

浅拷贝

a=[1,2,3]
print("浅拷贝")
b=a
print(a)
print(b)
print(id(a))
print(id(b))
a.append(4)
print(a)
print(b)

结果如下:

浅拷贝
[1, 2, 3]
[1, 2, 3]
35432328
35432328
[1, 2, 3, 4]
[1, 2, 3, 4]

可以发现a和b的引用地址都是相同的,一旦a引用的内容发生改变,b引用的也会发生改变,两者的地址是共享的

深拷贝的copy

import copy
print("深拷贝的copy")
a=[1,2,3]
b=[4,5,6]
c=[a,b]
d=copy.copy(c)
print(c)
print(d)
print(id(c))
print(id(d))
c.append(7)
print(c)
print(d)

运行结果如下:

深拷贝的copy
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
36957576
36957512
[[1, 2, 3], [4, 5, 6], 7]
[[1, 2, 3], [4, 5, 6]]

可以看到c和d的引用地址不同,深拷贝的copy复制了地址的内容并且创建了一个新的地址,对c的地址内容进行添加,数据也不会进行共享。那么如果修改c中的a元素呢?

c.remove(7)
a.remove(3)
print(c)
print(d)

结果如下:

[[1, 2], [4, 5, 6]]
[[1, 2], [4, 5, 6]]

我们发现对c的元素a进行了修改,c和d的引用地址内容都发生了变化。

深拷贝的deepcopy

import copy
print("深拷贝的deepcopy")
a=[1,2,3]
b=[4,5,6]
c=[a,b]
d=copy.deepcopy(c)
print(c)
print(d)
print(id(c))
print(id(d))
c.append(7)
print(c)
print(d)
c.remove(7)
a.remove(3)
print(c)
print(d)
结果如下:
深拷贝的copy
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
43183496
43183432
[[1, 2, 3], [4, 5, 6], 7]
[[1, 2, 3], [4, 5, 6]]
[[1, 2], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
我们可以发现,deepcopy有浅拷贝,以及深拷贝的copy的所有功能并且还满足对其元素地址内容的拷贝。这也是深拷贝中copy和deepcopy的区别。

注明:

使用深拷贝里的copy功能的时候,它会根据当前拷贝的数据类型是可变类型还是不可变类型有不同的处理方式,如果是不可变类型比如元组处理方式就会变成浅拷贝。




猜你喜欢

转载自blog.csdn.net/qq_36828513/article/details/80053916