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实现根据月份和日期得到星座的方法
Mar 27 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
wxpython实现图书管理系统
Mar 12 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python实发邮件实例详解
Nov 11 Python
python第三方库学习笔记
Feb 07 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
Python实现子类调用父类的初始化实例
Mar 12 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 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 array_flip() 删除数组重复元素
2009/01/14 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
url地址自动加#号问题说明
2010/08/21 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
js读取cookie方法总结
2014/10/31 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
django中模板的html自动转意方法
2018/05/27 Python
Python中GIL的使用详解
2018/10/03 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
微信公众号token验证失败解决方案
2019/07/22 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
C语言50道问题
2014/10/23 面试题
通信专业个人自我鉴定
2013/10/21 职场文书
离婚协议书格式
2014/11/21 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
一条 SQL 语句执行过程
2022/03/17 MySQL