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使用nntp读取新闻组内容的方法
May 08 Python
Python使用time模块实现指定时间触发器示例
May 18 Python
Python守护线程用法实例
Jun 23 Python
python通过百度地图API获取某地址的经纬度详解
Jan 28 Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 Python
Python绘制二维曲线的日常应用详解
Dec 04 Python
如何通过Django使用本地css/js文件
Jan 20 Python
在Mac中配置Python虚拟环境过程解析
Jun 22 Python
python实现数字炸弹游戏程序
Jul 17 Python
Python Sqlalchemy如何实现select for update
Oct 12 Python
Python matplotlib多个子图绘制整合
Apr 13 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 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
第五节--克隆
2006/11/16 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
js导航菜单(自写)简单大方
2013/03/28 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
js表单验证实例讲解
2016/03/31 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
Python通过len函数返回对象长度
2020/10/22 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
家长给老师的道歉信
2014/01/13 职场文书
工程承包协议书
2014/04/22 职场文书
预防煤气中毒方案
2014/06/16 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
稽核岗位职责范本
2015/04/13 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
15个值得收藏的JavaScript函数
2021/09/15 Javascript