当前位置: 首页 > 后端技术 > Python

Python面试必答题

时间:2023-03-25 22:47:33 Python

之前的面试中,问的最多的一个问题就是赋值原理,深拷贝和浅拷贝。今天小编就带大家来分析一下这个问题。首先,这个问题设计的知识点是什么?我们首先要搞清楚这个问题。这个问题涉及到我们计算机的底层——内存。那么我们现在如何解决这个问题呢?这个问题问我们赋值、深拷贝和浅拷贝在我们的内存中有什么样的表现形式。大家都知道万物皆对象,而对象就是内存分配的一块存储区域。那么这道题通俗的说法就是赋值在内存中是否分区域,深拷贝和浅拷贝有什么区别?下面一一说说赋值赋值就是把一个变量(名字)赋值给值,这样我们就可以使用这个值了。内存中固定id的数据有几种类型:int类型、字母、空格等。对于变量id的数据,如果同时赋值给两个变量,那么这两个变量就是同一个对象,它们都将指向该值。内存地址。a=123b=123print(id(a),id(b))执行结果:(1590328144,1590328144)然后是其他数据类型(如字符串、列表、字典等),如果赋值给两个变量同时,那么他们就是两个对象,分别指向各自数据的内存地址。a=[1,2,3]b=[1,2,3]print(id(a),id(b))执行结果:18815666795601881566679240如果b没有赋值,直接b=a,那么他们是一种引用关系,其中b指的是a的对象,会指向a所在的内存地址。(我们在面试过程中被问到assignment,一般面试官也会提到这个现象,就回答这个)a=[1,2,3]b=aprint(id(a),id(b))执行结果:21665634104402166563410440浅拷贝这里我们将使用库拷贝(python自带)。浅拷贝是指当一个数据有嵌套的数据类型(如[1,2,[3,4,5]])时,只能将最外层的数据复制出来,成为一个完全独立的个体。也就是说生成了一个新的对象,但是二级数据不能复制,只是引用,内存地址不变。这会造成一种现象:修改一个对象的外部数据,而另一个对象的数据不会发生变化,而修改其中一个对象的内部数据,也会改变另一个对象的数据。importcopya=[1,2,3,[4,5,6]]#浅拷贝b=copy.copy(a)#修改第一层数据a[0]=10print(a)print(b)print(id(a),id(b))执行结果:[10,2,3,[4,5,6]][1,2,3,[4,5,6]]17242965701841724296571464importcopya=[1,2,3,[4,5,6]]#浅拷贝b=copy.copy(a)#修改第二层数据a[3][0]=10print(a)print(b)print(id(a),id(b))执行结果:[1,2,3,[10,5,6]][1,2,3,[10,5,6]]18136041813201813604182600深拷贝深拷贝和浅拷贝的区别在于无论数据类型中嵌套了多少数据类型,它都会将所有的数据完全复制到一个全新的对象中,修改其中任何一个数据都不会影响其他对象的数据。importcopya=[1,2,3,[4,5,6]]#深拷贝b=copy.deepcopy(a)#修改第二层数据a[3][0]=10print(a)print(b)print(id(a),id(b))执行结果:[1,2,3,[10,5,6]][1,2,3,[4,5,6]]22744880018642274488003144然后结论看到这里,明白我们的assignment,浅拷贝和深拷贝了吗?赋值是直接使用对象的数据,不改变内存地址。浅拷贝是指将第一层对象数据复制成为一个新的对象,所以地址发生变化,但是第二层甚至更深的数据只会被引用,不会产生新的地址,所以改变它的数据两个对象都会改变。深拷贝会将所有的数据复制到一个新的对象中,而且地址是完全改变的,所以改变一个对象的数据不会影响到另一个对象。如果以后再遇到这个问题,这样回答一定会给你满分。