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基于twisted实现简单的web服务器
Sep 29 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 Python
pytorch下使用LSTM神经网络写诗实例
Jan 14 Python
使用Python将Exception异常错误堆栈信息写入日志文件
Apr 08 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
Python super()函数使用及多重继承
May 06 Python
为什么相对PHP黑python的更少
Jun 21 Python
pytorch加载自己的图像数据集实例
Jul 07 Python
Python读取yaml文件的详细教程
Jul 21 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入门源程序
2006/10/09 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
两种设置php载入页面时编码的方法
2014/07/29 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
php格式化时间戳
2016/12/17 PHP
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
使用PYTHON接收多播数据的代码
2012/03/01 Python
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
Java的for语句中break, continue和return的区别
2013/12/19 面试题
写出一个方法实现冒泡排序
2016/07/08 面试题
会计学应届毕业生推荐信
2013/11/04 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
电大毕业个人生自我鉴定
2014/03/26 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
鲁迅故里导游词
2015/02/05 职场文书
教师学期末个人总结
2015/02/13 职场文书
交通事故责任认定书
2015/08/06 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书