当前位置: 首页 > 科技观察

Python面试高频题:浅拷贝和深拷贝_0

时间:2023-03-13 22:22:17 科技观察

在python面试中,浅拷贝和深拷贝是一道比较难的题。六个大人从来没有听说过浅拷贝和深拷贝,三个大人只了解它们的基本概念和简单的区别。只有不到一个成年人能准确的分辨出两者的区别,并能完成相关代码demo的编写!今天就让我们解决这个难点,增加面试的推广权重吧!这篇文章也可能是全网讲解浅拷贝和深拷贝最通俗易懂的文章。只要跟着文中的例子去实践,你一定会明白浅拷贝和深拷贝的技术难点!变量赋值在Python变量数据类型(列表、字典、集合)中,将一个变量数据类型的变量赋值给另一个变量。这两个变量指的是同一个对象,内存地址是一样的。在修改的一个变量时,另一个变量也会随之修改。如果想了解python中可变数据类型和不可变数据类型的技术细节,请看文章:Python面试高频题:可变数据类型和不可变数据类型的区别。举个我之前文章的例子。l1=['a','b','c']l2=l1print(id(l1))print(id(l2))l2.append('d')print("************")打印(id(l1))打印(l1)打印(id(l2))打印(l2)输出:838366483528838366483528************838366483528['a','b','c','d']838366483528['a','b','c','d']输出结果这里不做解释,l1和l2的地址相同,所以会产生影响。浅拷贝复制对象的最顶层,仅复制对象的“引用”。举个上一篇文章的例子,列表只有一层,即元素不包含其他列表。l3=['x','y','z']l4=list(l3)print(id(l3))print(id(l4))l4.append('a')print(l3)print(l4)output831456302152831480344136['x','y','z']['x','y','z','a']从结果可以看出l3和l4的地址不一样,所以它们彼此不同会有影响。再举个例子,让l3中的第一个元素是一个列表。l3=[['x','y','z'],'a','b']l4=list(l3)print(id(l3))print(id(l4))l4.append('c')print(l3)print(l4)结果533336249416533337391240[['x','y','z'],'a','b'][['x','y','z'],'a','b','c']结果完全符合预期,因为第一个元素是一个列表,所以它也有一个地址,我们把它打印出来。print(id(l3[0??]))print(id(l4[0]))结果为533336248904533336248904我们发现l3[0]和l4[0]的地址其实是一样的,然后执行下面的代码.l3[0].append('yy')print(l3)print(l4)结果[['x','y','z','yy'],'a','b'][['x','y','z','yy'],'a','b','c']符合预期,修改l3[0]的值也会影响l4[0]。那么如何才能让l3[0]和l4[0]互不影响,这就需要引入深拷贝。深拷贝深拷贝复制对象的每一层,复制的对象与原对象完全独立,没有任何关系。要实现深拷贝,需要使用copy模块中的deepcopy方法。importcopyl3=[['x','y','z'],'a','b']#l4=list(l3)#浅拷贝,使用=copy.copy(l3)也可以实现浅拷贝l4=copy.deepcopy(l3)#深度复制l4.append('c')print(id(l3[0??]))print(id(l4[0]))l3[0].append('yy')打印(l3)打印(l4)输出407168435784407166887304[['x','y','z','yy'],'a','b'][['x','y','z'],'a','b','c']可以看到l3[0]和l4[0]是完全独立的,互不影响。总结浅拷贝和深拷贝不多说了,可以用两张图简单说明一下:浅拷贝,如下图:深拷贝,如下图: