参考


和许多其他高级语言,Python中使用垃圾收集自动销毁这些对象不再使用。每个对象具有引用计数,当参考计数为0的Python安全销毁对象。

引用计数记录的引用的数目给定对象,并收集对象时引用的数目是零。由于主对象仅在对象引用的回收引用计数不能回收。

一组对象是指对方如果不能直接被其他对象引用,并且交通不便,永久将生存。如果一个应用程序不断地产生对象的不可访问,例如基团,发生了内存泄漏。

内使用弱参考组中的对象(ⅰ。?。时,引用计数未在引用计数)有时避免参考环,并因此可以被用来解决弱引用的循环引用的问题。

在计算机编程,弱引用,强参考相反,它指的是对象的引用不能确保无法恢复的垃圾收集器的参考。如果只有一个对象由弱引用引用,它可以在任何时候恢复。主要影响是降低弱引用的循环引用存在以减少不必要的存储器的对象的数目。

使用weakref模块,你可以创建一个弱引用对象,Python的引用计数为0或回收时只有微弱的对象引用对象的对象。

创建弱引用

您可以拨打weakref模块REF(OBJ [回调])创建一个弱引用,OBJ你想有一个弱引用对象,回调是一个可选功能时,Python的,因为没有引用导致要销毁的对象,被称为。回调回调需要一个参数(对象弱引用)。

一旦你有一个弱引用的对象,你就能获取对象是弱引用通过调用弱引用。

上面的代码的引用计数,我们使用sys包以查看对象。请注意,使用时的参考传递给该参数的参数实际上会创建一个临时参考。因此,获得的结果getrefcount(),将超过所需的1-。

一旦没有其他参考这个对象,调用弱引用返回None,因为Python已经破坏了对象。注意:大多数对象无法通过弱引用访问。

weakref模块getweakrefcount(OBJ)和getweakrefs(OBJ)返回弱参考号码和引用对象的列表。

创建缓冲区对象弱引用(这些对象是非常昂贵的资源)是有用的。

创建一个代理对象

代理对象是弱引用对象,它们表现得就像引用对象,你不容易接触到第一个呼叫背后的弱引用对象。创建代理对象代理weakref模块(OBJ [,回调])功能。使用代理对象就如同对象本身:

相同的回调函数参数的对象和ref。Python的删除的对象的引用之后,使用代理将导致一个weakref。引发ReferenceError错误。

循环引用

如上所述,使用弱引用的,可以解决不能回收垃圾的循环引用的问题。
首先,我们来看一下传统的循环引用,创建一个简单的图形类,然后创建三个实例图:

这使用Python GC库的几种方法,解释如下:

  • GC。收集()垃圾收集
  • GC。让垃圾垃圾桶的列表
  • GC。set_debug(GC。DBEUG_LEAK)印刷不能看到的物体信息

结果如下:

我们可以从结果看,即使我们删除本地参考图实例,它仍然存在垃圾名单,不能回收。
接下来,创建WeakGraph类的弱引用:

结果如下:

上层阶级,使用代理来指示该对象已被视为演示()删除本地引用的所有对象,周期将被断开,因此垃圾回收期可以删除的对象。

因此,如果我们需要使用我们的循环引用,尽量在实际工作中使用弱引用来实现。

缓存对象

而仅可用于参考弱维护单个对象的,如果你想创建所谓弱引用多个对象?然后你可以用它来实现。

类,根据定义,在本质上是一种类型的字典的,但它是弱基准值型。当对象不再由这些值所引用被其他非弱引用对象引用,则引用的对象可以通过垃圾收集器中回收。
下面的示例示出了具有常规字典之间的差。

结果如下:


本文链接:Python 弱引用 学习

您可能也会喜欢

友情链接:

心经唱诵 大悲咒注音 经文