【第5章 序列、集合和字典】循环引用

循环引用的核心就是 两个或多个对象互相引用,形成闭环,导致每个对象的引用计数都无法降至 0,GC 仅靠引用计数机制无法回收它们(需依赖标记-清除机制)。

你举的例子是最典型的场景:

a = []
b = []
a.append(b)  # a 引用 b(a 的元素是 b)
b.append(a)  # b 引用 a(b 的元素是 a)

此时 ab 形成闭环:a 的引用计数 ≥1(被 b 引用),b 的引用计数 ≥1(被 a 引用),即使后续 del adel b 解绑名字,闭环依然存在,引用计数仍不为 0。

补充两个关键细节,帮你更透彻理解:

  1. 不局限于列表:任何可变对象(字典、自定义类实例等)都可能形成循环引用,比如:
    class Node:
        def __init__(self, next=None):
            self.next = next
    
    x = Node()
    y = Node()
    x.next = y  # x 引用 y
    y.next = x  # y 引用 x
    
  2. GC 的处理逻辑:CPython 会通过「标记-清除」机制扫描不可达的循环引用(比如上面 del xdel y 后,xy 不再被任何名字引用,属于“不可达闭环”),最终回收这些对象。

需要我出几道题帮你巩固“循环引用”的知识点,或者写代码演示它如何导致内存泄露、GC 如何回收吗?

posted @ 2025-11-19 10:42  wangya216  阅读(0)  评论(0)    收藏  举报