del命令与垃圾回收
- del命令只会删除对象的引用,但是不会删除对象。但是删除引用有可能导致对象被删除。
- python对象被删除有两种情况:
- 某个对象的引用计数为零
- 一组对象之间全是相互引用,导致组中对象不可取
- 两种情况可以归为一种,如果某个对象不可获取了,那么将会被当作垃圾回收。
- 尽量不要自己实现特殊方法__del__
弱引用
- 弱引用不会增加对象的引用计数数量。
- 弱引用的目标对象称为所指对象。
- 弱引用不会妨碍所指对象被当作垃圾回收。
- 弱引用是可调用的对象,其返回值是被引用的对象。若被指对象不存在了,则返回None。
弱引用例子
- 使用弱引用需要首先导入weakref包
- 有一点需要注意,如果控制台输出的结果不为None,则python会自动把 _ 变量名绑定到结果不为None的那个结果上,因此可能会隐式地增加了新的引用。
![]()
![]()
- 创建一个弱引用
- 因为弱引用是可调用对象,其返回结果正是所指对象
- 将变量a_set不再引用集合{0, 1},引用计数减一
- 此时调用弱引用仍能返回集合{0, 1},这个因为集合{0, 1}还没有被回收,绑定其上的还有一个变量,即 _ 。且这一行执行完,_ 仍绑定在集合{0, 1}上。
- 此时弱引用返回结果当然不是None,但是由于控制台输出了False,因此变量 _ 被绑定到了False上,集合{0,1}的引用技术归零,被垃圾回收。
- 此时集合{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)
评论()
收藏
举报