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将xml和xsl转换为html的方法
Mar 10 Python
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
简单介绍Python中的len()函数的使用
Apr 07 Python
python脚本实现xls(xlsx)转成csv
Apr 10 Python
Django如何实现内容缓存示例详解
Sep 24 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
python openvc 裁剪、剪切图片 提取图片的行和列
Sep 19 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 Python
python数字转对应中文的方法总结
Aug 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
PHP5 面向对象程序设计
2008/02/13 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
载入进度条 效果
2006/07/08 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
Python入门篇之编程习惯与特点
2014/10/17 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
详解移动端Html5页面中1px边框的几种解决方法
2018/07/24 HTML / CSS
毕业班联欢会主持词
2014/03/27 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
大学辅导员述职报告
2015/01/10 职场文书
开平碉楼导游词
2015/02/06 职场文书
工程部部长岗位职责
2015/02/12 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
党章学习心得体会2016
2016/01/14 职场文书
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle
Go timer如何调度
2021/06/09 Golang