钢之面经术师----测试篇 001
(1)python垃圾回收,原理是什么,什么时候会使用什么机制,为什么会这样 ?
python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略。
引用计数:
在Python中每一个对象的核心就是一个结构体PyObject,它的内部有一个引用计数器(ob_refcnt)。程序在运行的过程中会实时的更新ob_refcnt的值,来反映引用当前对象的名称数量。当某对象的引用计数值为0,那么它的内存就会被立即释放掉。
以下情况是导致引用计数加一的情况:
对象被创建,例如a=2
对象被引用,b=a
对象被作为参数,传入到一个函数中
对象作为一个元素,存储在容器中
下面的情况则会导致引用计数减一:
对象别名被显示销毁 del
对象别名被赋予新的对象
一个对象离开他的作用域
对象所在的容器被销毁或者是从容器中删除对象
标记清除:解决循环引用
A)标记阶段,遍历所有的对象,如果是可达的(reachable),也就是还有对象引用它,那么就标记该对象为可达;
B)清除阶段,再次遍历对象,如果发现某个对象没有标记为可达,则就将其回收。
分代收集:
在循环引用对象的回收中,整个应用程序会被暂停,为了减少应用程序暂停的时间,Python 通过“分代回收”(Generational Collection)以空间换时间的方法提高垃圾回收效率。
分代回收是基于这样的一个统计事实,对于程序,存在一定比例的内存块的生存周期比较短;而剩下的内存块,生存周期会比较长,甚至会从程序开始一直持续到程序结束。生存期较短对象的比例通常在 80%~90% 之间,这种思想简单点说就是:对象存在时间越长,越可能不是垃圾,应该越少去收集。这样在执行标记-清除算法时可以有效减小遍历的对象数,从而提高垃圾回收的速度。
参考:https://zhuanlan.zhihu.com/p/83251959; https://blog.csdn.net/xiongchengluo1129/article/details/80462651
(2)python 数据结构,区别?
列表list、元组tuple、字典dict、集合set
列表可以修改,而字符串和元组不能。
表中的每个元素都可变的,意味着可以对每个元素进行修改和删除;
列表是有序的,每个元素的位置是确定的,可以用索引去访问每个元素;
列表中的元素可以是Python中的任何对象;
可以为任意对象就意味着元素可以是字符串、整数、元组、也可以是list等Python中的对象。
元组由若干逗号分隔的值组成,元组在输出时总是有括号的,以便于正确表达嵌套结构。在输入时可能有或没有括号,不过括号通常是必须的(如果元组是更大的表达式的一部分)。Tuple一经初始化,就不能修改,没有List中的append(), insert(), pop()等修改的方法,只能对元素进行查询。
集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。可以用大括号({})创建集合。注意:如果要创建一个空集合,你必须用 set() 而不是 {} ;后者创建一个空的字典。
一对大括号创建一个空的字典:{}。
字典中的数据必须以键值对的形式出现,即k,v:
键不可重复,值可重复
键若重复字典中只会记该键对应的最后一个值
字典中键(key)是不可变的,何为不可变对象,不能进行修改;而值(value)是可以修改的,可以是任何对象。
参考:https://www.runoob.com/python3/python3-data-structure.html; https://www.cnblogs.com/pychina/p/10219772.html

浙公网安备 33010602011771号