Python中复制,浅拷贝,深拷贝的区别详解

时间:2021-04-17 19:49:21

一、前言

Python对对象进行拷贝时有三种方式:复制、浅拷贝和深拷贝。三种复制的实现逻辑都各不相同,使用不同的拷贝方式,会产生不同的结果。区别好这三种方式,在编程的时候可以提高效率,降低错误率。

二、复制

复制就是使用“=”。使用“=”的时候,实际上是传递的是对象的引用,当对象发生修改的时候,复制体也会发生同等的改变,无论何种改变。

三、浅拷贝

浅拷贝,字面理解,就是只拷贝浅层的东西。他只会拷贝目标对象,目标的子对象(深层东西)不进行拷贝。

当目标对象进行修改之后,复制体不会发生改变。

当目标对象的子对象(深层东西)发生修改之后,复制体会发生改变。

浅拷贝的使用方法:

copy.copy(object)

例如:

import copy
a = [1,[2]]
print('目标对象原件:',a)
b = copy.copy(a)
a.append('3')            #目标对象进行浅层改变
print('目标对象改变:',a)
print('复制体的结果:',b)
>>>
目标对象原件: [1, [2]]
目标对象改变: [1, [2], '3']
复制体的结果: [1, [2]]

import copy
a = [1,[2]]
print('目标对象原件:',a)
b = copy.copy(a)
a[1].append('3')      #目标对象的子对象进行改变,即深层改变
print('目标对象改变:',a)
print('复制体的结果:',b)
>>>
目标对象原件: [1, [2]]
目标对象改变: [1, [2, '3']]
复制体的结果: [1, [2, '3']]

四、深拷贝

深拷贝,字面理解,就是深层次的拷贝。不仅拷贝了目标对象,也拷贝了目标对象的子对象。

当无论对目标对象或者目标对象的子对象进行改变,复制体都不会改变!

深拷贝的使用方法:

copy.deepcopy(object)

例如:

import copy
a = [1,[2]]
print('目标对象原件:',a)
b = copy.deepcopy(a)
a[1].append('3')      #目标对象以及其子对象进行改变,即深层改变+浅层改变
a.append('3')
print('目标对象改变:',a)
print('复制体的结果:',b)
>>>
目标对象原件: [1, [2]]
目标对象改变: [1, [2, '3'], '3']
复制体的结果: [1, [2]]