python如何在循环引用中管理内存


Posted in Python onMarch 20, 2018

python中通过引用计数来回收垃圾对象,在某些环形数据结构(树,图……),存在对象间的循环引用,比如树的父节点引用子节点,子节点同时引用父节点,此时通过del掉引用父子节点,两个对象不能被立即释放

需求:

如何解决此类的内存管理问题?

如何查询一个对象的引用计数?

       import sys

       sys.getrefcount(obj)

       # 查询引用计数必多 1 ,因为object也引用 查询对象

如何解决内存管理问题?

  • 通过weakref,进行弱引用,当del时候,不再引用,在引用方添加weakref.ref(引用obj);
  • 使用引用的时候,需要用到函数调用的形式
#!/usr/bin/python3
 
import weakref
import sys
 
 
class Data(object):
 def __init__(self, value, owner):
  self.value = value
   
  # 声明弱引用,owner为Node类本身
  self.owner = weakref.ref(owner)
  
 # 通过函数调用的方式访问引用对象
 def __str__(self):
  return "%s's data, value is %s" % (self.owner(), self.value)
  
 def __del__(self):
  print('in_data.__del__')
 
 
class Node(object):
 def __init__(self, value):
   
  # 把类本身,也当做参数传入Data类中
  self.data = Data(value, self)
  
 # 自定义对象名,容易辨认
 def __str__(self):
  return 'Node'
  
 def __del__(self):
  print('in_node.__del__')
  
 
if __name__ == '__main__':
 node = Node(100)
 print(node.data)
  
 # 打印node对象的引用计数
 print(sys.getrefcount(node) - 1)
  
 # 当删除node对象时候,Data实例对象在引用计算为0也相应释放
 del node
  
 input('del done >>>>>')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
python使用opencv读取图片的实例
Aug 17 Python
python中kmeans聚类实现代码
Feb 23 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
May 18 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
解决python3 Pycharm上连接数据库时报错的问题
Dec 03 Python
python批量获取html内body内容的实例
Jan 02 Python
python Selenium实现付费音乐批量下载的实现方法
Jan 24 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
解决python中的幂函数、指数函数问题
Nov 25 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
Windows 7下Python Web环境搭建图文教程
Mar 20 #Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 #Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 #Python
Django开发中复选框用法示例
Mar 20 #Python
python如何通过twisted实现数据库异步插入
Mar 20 #Python
分分钟入门python语言
Mar 20 #Python
python使用生成器实现可迭代对象
Mar 20 #Python
You might like
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
php无序树实现方法
2015/07/28 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
用javascript实现给图片加链接
2007/08/15 Javascript
JavaScript 的方法重载效果
2009/08/07 Javascript
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
实例讲解python中的序列化知识点
2018/10/08 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
Python 使用type来定义类的实现
2019/11/19 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
西部世纪面试题
2014/12/05 面试题
小学红领巾中秋节广播稿
2014/01/13 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
道德与公民自我评价
2015/03/09 职场文书
酒店前台接待岗位职责
2015/04/02 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书