代码之家  ›  专栏  ›  技术社区  ›  Dale Reidy

python对象没有引用,但仍然可以通过weakref访问?

  •  3
  • Dale Reidy  · 技术社区  · 15 年前

    gc.get-referers(obj)是否可以返回对象的空列表,但该对象仍然可以通过弱引用访问?

    如果是这样,我将如何开始尝试确定此对象未被垃圾收集的原因?

    编辑:在这种情况下,我不确定代码示例会有什么帮助-显然在某个地方有一个强引用,但是如果我能找到它,我会被诅咒的。我的印象是,所有对对象的强引用都将由get_referers()标识。

    编辑:解决 . 我发现这个变量有一个很强的引用——它在游戏事件循环中,但不是类变量,所以get-referers没有找到它。

    5 回复  |  直到 15 年前
        1
  •  1
  •   Christopher    15 年前

    对: http://docs.python.org/library/weakref.html

    弱引用不会使对象保持活动状态。

    get_referers()函数将只定位那些支持垃圾收集的容器;将找不到引用其他对象但不支持垃圾收集的扩展类型。

    是什么让你认为这个物体没有被收集?另外,您尝试过gc.collect()吗?

        2
  •  1
  •   Torsten Marek    15 年前

    也可能是一个引用被错误的C扩展泄露了,imho您将看不到引用者,但引用计数仍然不会下降到0。您可能需要检查的返回值 sys.getrefcount .

        3
  •  1
  •   Oddthinking    14 年前

    我很高兴你发现了你的问题,与最初的问题无关。尽管如此,我对子孙后代的答案有不同的看法,以防其他人有问题。

    对象没有引用者,但未被垃圾收集是合法的。

    在python 2.7手册中:“允许一个实现推迟垃圾收集或完全忽略垃圾收集。”只要没有收集到仍然可以访问的对象,那么如何实现垃圾收集就关系到实现质量。

    禁止垃圾收集器是合法的。

    关于代和引用计数垃圾收集器的讨论涉及特定的cpython实现(如问题中所标记的那样)。

        4
  •  0
  •   Community CDub    8 年前

    AS Christopher says 弱引用不计入对象refcount,因此无法阻止python删除对象。

    但是,python的垃圾收集器不会删除循环引用中并且具有 __del__ 方法定义。
    您可以使用 gc.garbage .

        5
  •  0
  •   Glenn Maynard    15 年前

    如果您确实有对该对象的强引用,请使用gc.get-referers(obj)来查找它。

    如果您有泄漏,不知道泄漏的是什么,这会有所帮助:

    http://mg.pov.lt/objgraph.py http://mg.pov.lt/blog/hunting-python-memleaks http://mg.pov.lt/blog/python-object-graphs.html

    它是inspect模块的一个薄包装器;如果您难以跟踪不需要的引用,它可以帮助很多。不过,为了跟踪一个引用,gc.get-referers可能是您所需要的。