🐴 面试必问系列—深浅拷贝✔️
正值毕业季,大部分人会遇到走向社会的第一个难题—找工作面试,当你经历的面试多了,就会发现会有一些面试官经常问到的问题,比如:
问:你为什么会选择我们公司?
答:你们公司不是招人嘛😂
那么,我会在这个系列里讲讲那些经常被问到的面试题
现在先让我们一起来了解一下深浅拷贝 🎉
赋值
在Python中,赋值其实就是对象的引用。
a = 9999
b = a
print(a) #ouput:9999
print(b) #ouput:9999
print(id(a)) #ouput:1869259054928
print(id(b)) #ouput:1869259054928
这样赋值后,b和a不仅在值上相等,而且是同一个对象,也就是说在堆内存中只有一个数据对象9999,这两个变量都指向这一个数据对象。从数据对象的角度上看,这个数据对象有两个引用,只有这两个引用都没了的时候,堆内存中的数据对象9999才会等待垃圾回收器回收。
需要注意的是,它和下面的赋值过程是不等价的:
a = 9999
b = 9999
print(id(a)) #ouput:1869266158672
print(id(b)) #ouput:1869266158768
虽然a和b的值相等,但他们不是同一个对象,这时候在堆内存中有两个数据对象,只不过这两个数据对象的值相等。
不可变对象
对于不可变对象,修改变量的值意味着在内存中要新创建一个数据对象
>>> a = 9999
>>> b = a
>>> id(a)
2625562451792
>>> id(b)
2625562451792
>>> a = 20000
>>> id(a)
2625564836944
>>> id(b)
2625562451792
在a重新赋值之前,b和a都指向堆内存中的同一个数据对象9999,但a重新赋值后,因为数值类型9999是不可变对象,不能在原始内存块中直接修改数据,所以会新创建一个数据对象保存20000,最后a将指向这个20000对象。这时候b仍然指向9999,而a则指向20000。
可变对象
对于可变对象,比如列表,它是在"原处修改"数据对象的。比如修改列表中的某个元素,列表的地址不会变,还是原来的那个内存对