常见面试题中有深拷贝与浅拷贝的区别;

浅拷贝:只拷贝地址,不拷贝值,两个变量共享同一个对象;
深拷贝:拷贝值,如果列表中也是引用,就递归拷贝;
a = [11,22]
b = [33,44]
c = [a,b]
d = c
id(c)
id(d)

可以看出,c和d的内存地址即ID相同,这是典型的浅拷贝,如果改变a的值,那么c和d都会改变;

import copy
d = copy.deepcopy(c)
id(d)

此时d的ID是不同于c的,而且copy.deepcopy()是递归拷贝的,即改变a、b或者c的值,都不会影响到d,这就是深拷贝;

copy模块中还有一个容易混淆的copy.copy()函数,那么它与copy.deepcopy()有什么不同呢?

e = copy.copy(c)

此时e和c的ID是不同的,如果改变c的值,e不会改变,而如果改变a或b的值,那么e就会相应改变,说明copy.copy()只是深拷贝了第一层,第二层还是浅拷贝;

此时的拷贝对象c是一个可变的列表类型,如果是不可变的数据类型呢?

c2 = (a,b)
e2 = copy.copy(c2)
id(c2)
id(e2)

此时发现c2与e2的地址又是相同的;那么我们可以从中分析出copy.deepcopy()与copy.copy()的拷贝规律,即:

copy.deepcopy()总是深拷贝,支持递归拷贝;
copy.copy()  先判断拷贝类型,如果可变,只深拷贝第一层,不支持递归拷贝;如果不可变(如元组),就浅拷贝。

 

 

版权声明:本文为chaofan-原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/chaofan-/p/8525349.html