gpt4 book ai didi

python - 如果当对象的引用计数达到零时不能保证Python的weakref死亡,那么它的用例是什么?

转载 作者:行者123 更新时间:2023-11-30 23:01:39 24 4
gpt4 key购买 nike

Python 文档提出的弱引用用例之一是保留对大型缓存对象的引用而不增加其引用计数,thus not preventing them from being garbage collected when their time comes .

但是,垃圾收集并不能保证在对象的引用计数达到零后立即发生,并且弱引用仅在 GC 收集其目标时才会失效。因此,基本上可以保留对无效对象的有效(非死)weakref - PyPy's broken WeakSet is one example of such a scenario

因此,假设一个具有对抗性的垃圾收集器,是否存在弱引用为用户提供确定性且有用的行为的场景(除了终结器之外)?

最佳答案

这实际上并不是要在引用消失后立即对对象进行垃圾回收,并在这种情况下使弱引用无效。它实际上只是在没有其他对象引用该对象时允许该对象被垃圾收集。

一个常见的用例是观察者模式,您可以在其中向可观察对象添加观察者(或监听器)。这通常用于事件系统。假设您有一个带有点击事件的按钮;当您现在使用处理程序注册该单击事件时,您需要确保正确取消注册这些处理程序,否则您将遇到内存泄漏。可观察对象将保留对其监听器的引用,因此即使不再使用这些对象(除了作为处理程序的工作之外),这些对象也永远不会被垃圾收集。

此处使用弱引用可防止在确定是否对对象进行垃圾收集时将监听器注册计为引用。因此,您无需显式注销事件处理程序,从而更易于使用。您可以只用弱引用注册处理程序,并在需要时删除监听器。

还有其他合法用例,Wikipedia has some但一般来说,弱引用是为了防止在没有其他强引用的情况下,对象仍保留在内存中。但这并没有说明对象何时真正被垃圾收集。

关于python - 如果当对象的引用计数达到零时不能保证Python的weakref死亡,那么它的用例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34844034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com