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算法学习之桶排序算法实例(分块排序)
Dec 18 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
从零开始学Python第八周:详解网络编程基础(socket)
Dec 14 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
Jun 23 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
使用Matplotlib 绘制精美的数学图形例子
Dec 13 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
Feb 09 Python
Python如何实现邮件功能
May 27 Python
如何用PyPy让你的Python代码运行得更快
Dec 02 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的explode和implode的使用说明
2011/07/17 PHP
php调用Google translate_tts api实现代码
2013/08/07 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
PHP引用的调用方法分析
2016/04/25 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
Vite和Vue CLI的优劣
2021/01/30 Vue.js
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python修改MP3文件的方法
2015/06/15 Python
Python常用的爬虫技巧总结
2016/03/28 Python
Python 获取div标签中的文字实例
2018/12/20 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
美国Max仓库:Max Warehouse
2020/05/31 全球购物
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
银行职员自我鉴定
2014/04/20 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
解放思想演讲稿
2014/09/11 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
php双向队列实例讲解
2021/11/17 PHP