面试题答案
一键面试引用计数原理
Python 中的每个对象都维护一个引用计数,记录当前指向该对象的引用(指针)数量。当对象被创建时,其引用计数设为 1。每当有新的引用指向该对象,引用计数加 1;当一个引用不再指向该对象(比如变量被重新赋值、对象所在作用域结束等情况),引用计数减 1。当引用计数减为 0 时,Python 垃圾回收机制会立即回收该对象所占用的内存空间。例如:
a = [1, 2, 3] # 列表对象引用计数为1
b = a # 列表对象引用计数加1,变为2
del a # 列表对象引用计数减1,变为1
del b # 列表对象引用计数减1,变为0,此时该列表对象占用的内存被回收
局限性
- 循环引用问题:如果两个或多个对象相互引用,形成一个循环引用的环,即使环中的对象不再被外部引用,它们的引用计数也不会为 0,从而导致内存无法被回收。例如:
class A:
def __init__(self):
self.b = None
class B:
def __init__(self):
self.a = None
a = A()
b = B()
a.b = b
b.a = a
del a
del b
# 此时 A 和 B 的实例对象形成循环引用,即使 a 和 b 已删除,它们占用的内存也不会因引用计数被回收
- 维护引用计数的开销:每次引用的增加或减少都需要更新对象的引用计数,这会带来一定的时间和空间开销,尤其是在频繁创建和销毁对象的场景下,对性能会有一定影响。