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协程用法实例分析
Jun 04 Python
python常用知识梳理(必看篇)
Mar 23 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
python正向最大匹配分词和逆向最大匹配分词的实例
Nov 14 Python
在django模板中实现超链接配置
Aug 21 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
Python 中@property的用法详解
Jan 15 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
使用Keras构造简单的CNN网络实例
Jun 29 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 Python
Python Selenium库的基本使用教程
Jan 04 Python
Python爬虫 简单介绍一下Xpath及使用
Apr 26 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+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
javascript实现文字无缝滚动效果
2017/08/26 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
Python中字典的基本知识初步介绍
2015/05/21 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
Python中三元表达式的几种写法介绍
2019/03/04 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
Python安装selenium包详细过程
2019/07/23 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
英国综合网上购物商城:The Hut
2018/07/03 全球购物
品酒会策划方案
2014/05/26 职场文书
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python