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使用append合并两个数组的方法
Apr 28 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
Apr 02 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
python基于SMTP协议发送邮件
May 31 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
python使用递归的方式建立二叉树
Jul 03 Python
python增加图像对比度的方法
Jul 12 Python
python操作cfg配置文件方式
Dec 22 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
Mar 23 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 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
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
javascript面向对象之对象的深入理解
2015/01/13 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
Python编程中的for循环语句学习教程
2015/10/14 Python
Python简单遍历字典及删除元素的方法
2016/09/18 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
2018/12/28 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
c语言常见笔试题总结
2016/09/05 面试题
室内设计专业个人的自我评价
2013/10/19 职场文书
财务会计专业推荐信
2013/11/30 职场文书
学生会离职感言
2014/02/11 职场文书
承德避暑山庄导游词
2015/02/03 职场文书