del与垃圾回收、弱引用

del命令与垃圾回收

  • del命令只会删除对象的引用,但是不会删除对象。但是删除引用有可能导致对象被删除。
  • python对象被删除有两种情况:
    • 某个对象的引用计数为零
    • 一组对象之间全是相互引用,导致组中对象不可取
    • 两种情况可以归为一种,如果某个对象不可获取了,那么将会被当作垃圾回收。
  • 尽量不要自己实现特殊方法__del__

弱引用

  • 弱引用不会增加对象的引用计数数量。
  • 弱引用的目标对象称为所指对象。
  • 弱引用不会妨碍所指对象被当作垃圾回收。
  • 弱引用是可调用的对象,其返回值是被引用的对象。若被指对象不存在了,则返回None。

弱引用例子

  • 使用弱引用需要首先导入weakref包
  • 有一点需要注意,如果控制台输出的结果不为None,则python会自动把 _ 变量名绑定到结果不为None的那个结果上,因此可能会隐式地增加了新的引用。

  1. 创建一个弱引用
  2. 因为弱引用是可调用对象,其返回结果正是所指对象
  3. 将变量a_set不再引用集合{0, 1},引用计数减一
  4. 此时调用弱引用仍能返回集合{0, 1},这个因为集合{0, 1}还没有被回收,绑定其上的还有一个变量,即 _ 。且这一行执行完,_ 仍绑定在集合{0, 1}上。
  5. 此时弱引用返回结果当然不是None,但是由于控制台输出了False,因此变量 _ 被绑定到了False上,集合{0,1}的引用技术归零,被垃圾回收。
  6. 此时集合{0,1}已经被回收,因此调用弱引用返回None。

weakref集合

  • weakref.ref类是低级接口,尽量不要直接使用。应尽量使用weakref集合类。
  • weakref集合类包括 WeakKeyDictionary、WeakValueDictionary、WeakSet、finalize。

弱引用的局限

  • 不是每个python对象都可以作为弱引用的所指对象。
  • list和dict示例不能作为所指对象,但它们的子类可以。
  • set可以作为所指对象。
  • 自定义类型可以作为所指对象。
  • int和tuple不能作为所指对象,其子类也不行。
posted @ 2022-03-13 20:15  肖肖凯  阅读(75)  评论(0)    收藏  举报