常见面试题中有深拷贝与浅拷贝的区别;
浅拷贝:只拷贝地址,不拷贝值,两个变量共享同一个对象;
深拷贝:拷贝值,如果列表中也是引用,就递归拷贝;
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() 先判断拷贝类型,如果可变,只深拷贝第一层,不支持递归拷贝;如果不可变(如元组),就浅拷贝。