社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

<一起面试吧>python基础之垃圾回收机制 & 深浅拷贝

程序媛小庄 • 4 年前 • 267 次点击  
阅读 20

<一起面试吧>python基础之垃圾回收机制 & 深浅拷贝

这是我参与更文挑战的第20天,活动详情查看: 更文挑战

微信公众号搜索【程序媛小庄】,领取全套python全栈教程,还有小庄整理的不断更新的电子书、面试资料等你来拿哦~

一位穿着高跟鞋御姐范的HR带我走进一间会议室"稍等一下,面试官马上就来",我怀着忐忑的心情等面试官进来,过了一会,一个拿着mac本头戴帽子的大佬进来了...

src=http___p0.ssl.qhimgs4.com_t01cce44de7c86a1d33.jpg&refer=http___p0.ssl.qhimgs4.jfif

面试官大佬:先做个简单的自我介绍吧。

我:(一本正经的胡说八道)毕业于清华大学计算机专业,之前从事过xxx工作,主要使用的技术栈是xxx,由于xxx原因考虑换一份工作。

面试官大佬:我看你简历上面写到了解垃圾回收机制是吧,那就简单说一下python的垃圾回收机制呗。

我:(内心一喜,还好提前准备了,但是不要表现出来)垃圾回收机制是当前程序中的一个线程,垃圾回收机制采用的主要方法是引用计数+标记清除+分代回收。首先是引用计数,相当于有一个变量计数器记录每个变量被引用的次数,当次数为0时就会被回收;但是也会有意外情况,比如容器类型的数据产生的循环引用无法通过引用金属清理内存空间时就需要使用标记清除的方式;另外如果一个名字被引用的次数只要发生变化,就需要引用计数进行扫描的话,效率会非常低,分代回收就是为了解决引用计数的效率问题,当一个名字经历很多次扫描都没被回收,解释器就会认为这个名字会被经常使用,对该名字的扫描次数就会相应减少。

面试官大佬:(小伙子答的不错)那你再说说深浅拷贝是怎么回事?

我:(so easy)对于不可变类型来说不存在深浅拷贝的问题,深浅拷贝主要讨论的对象是可变类型的数据,浅拷贝不会区分容器内的元素是否是可变类型,拷贝后产生的新容器中的元素内存地址还是指向旧容器中元素的内存地址,如果容器中包含可变类型的元素,旧容器中可变类型的元素发生变化时,新容器中该可变类型的元素也会发生变化。

深拷贝的话会区分容器中元素是否是可变类型,对于不可变类型就直接指向原来容器内该元素的内存地址,对于可变类型的元素来说会再拷贝一份内存地址,如果嵌套多层可变类型的元素的话,深拷贝会对每一层的元素都进行判断是否是可变类型,通过这样的操作就可以实现新旧容器的完全独立。

面试官大佬:那列表的切片属于什么深拷贝还是浅拷贝?

我:属于浅拷贝。

面试官大佬:嗯嗯,小伙子基础不错,我这还有点忙,咱改日再约,问题也不能一下问完不是?

我:好嘞,随时恭候...

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/115967
 
267 次点击