Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python对象没有引用器,但仍然可以通过weakref访问?_Python_Garbage Collection_Cpython - Fatal编程技术网

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

Python对象没有引用器,但仍然可以通过weakref访问?,python,garbage-collection,cpython,Python,Garbage Collection,Cpython,gc.get_referers(obj)是否有可能返回对象的空列表,但该对象仍然可以通过弱引用访问 如果是这样,我将如何开始尝试确定该对象未被垃圾收集的原因 编辑:我不确定一个代码示例在这种情况下会有什么帮助——显然有一个很强的引用,但如果我能找到它,我会被诅咒的。我的印象是,对对象的所有强引用都将由get_referers()标识 编辑:已解决。我发现该变量具有强引用-它位于游戏事件循环中,但不是类变量,因此get_Referers没有拾取它。是: 弱引用不能使对象保持活动状态 get_ref

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

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

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

编辑:已解决。我发现该变量具有强引用-它位于游戏事件循环中,但不是类变量,因此get_Referers没有拾取它。

是:

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

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

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

因为弱引用不计入对象refcount,因此无法阻止Python删除对象

但是,Python的垃圾收集器不会删除循环引用中并定义了
\uu del\uu
方法的对象。

您可以使用检查(并修复)这种情况。

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

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


它是围绕inspect模块的薄薄包装;如果你很难追踪不需要的参考资料,这会有很大帮助。不过,仅仅为了跟踪引用,您可能只需要gc.get\u referers。

也可能是由于错误的C扩展泄漏了引用,因此您将看不到引用,但引用计数仍然不会下降到0。您可能需要检查
sys.getrefcount
的返回值

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

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

Python2.7手册中写道:“一个实现可以推迟垃圾收集或完全忽略垃圾收集——垃圾收集是如何实现的,这是实现质量的问题,只要没有收集到仍然可以访问的对象。”

NO-OP垃圾收集器是合法的


关于分代和引用计数垃圾收集器的讨论是指一个特定的CPython实现(如问题中标记的)

我仍然通过weakref获得一个对象实例,而我希望没有。你确定其他地方没有很强的引用吗?此外,垃圾收集不是自动的(即使使用ref计数,如果存在一个引用循环,这些引用将等待到使用不同的垃圾收集算法),是的,但会持续多长时间?永远?也就是说,你让程序运行了很长很长一段时间,而对象从未收集?Python的GC是分代的,因此收集对象可能需要一些时间。请给出一个简单的代码示例。否则就不清楚你的意思了。弱引用本身是可访问的还是被引用对象本身可通过weakref访问?您是如何找到具有引用的变量的?我正试图追踪这样一个漏洞,但它是间歇性的,gc.get_Referers正在返回[]。有没有办法找到对该对象的“本地”引用的位置?在调用gc.collect()之后,gc.garbage是一个空列表-该对象及其超类都没有定义del。循环引用是否可以通过gc.get_referers()返回的列表识别?