Earyant的技术博客

欢迎来到Earyant的技术博客,在这里我将与你分享新技术。

python面试题

1. 垃圾回收机制

引用计数为主,分代收集为辅。在 python 中,如果一个对象的引用数为 0, python 虚拟机就会回收这个对象的内存。

  • 导致引用计数 +1 的情况:

    • 对象被创建: a = classname()
    • 对象被引用: b = a
    • 对象被作为参数,传入到一个函数中: func(a)
    • 对象作为一个元素,存储在容器内: list_name = [a, a]
  • 导致引用计数 -1 的情况:

    • 对象的别名被显式销毁, 如: del a
    • 对象的别名被赋予新的对象,如:a = other_class()
    • 一个对象离开它的作用域,如函数执行完毕时,func 函数中的局部变量
    • 对象所在的容器被销毁,或从容器中删除对象

循环引用导致内存泄漏

1
2
3
4
5
6
c1=ClassA() # 内存 1 引用计数 +1 = 1
c2=ClassA() # 内存 2 引用计数 +1 = 1
c1.t=c2 # 内存 2 引用计数 +1 = 2
c2.t=c1 # 内存 1 引用计数 +1 = 2
del c1 # 内存 1 引用计数 -1 = 1
del c2 # 内存 2 引用计数 -1 = 1

如上文描述,由于循环引用,导致垃圾回收器都不会回收它们,所以就会导致内存泄露。

垃圾回收机制模块: gc

欢迎关注我的其它发布渠道