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 文件与目录操作
Dec 24 Python
python中文乱码的解决方法
Nov 04 Python
python中global用法实例分析
Apr 30 Python
Python脚本实时处理log文件的方法
Nov 21 Python
TensorFlow模型保存和提取的方法
Mar 08 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
Jun 26 Python
对Python中内置异常层次结构详解
Oct 18 Python
Python图像处理之颜色的定义与使用分析
Jan 03 Python
Python 获取ftp服务器文件时间的方法
Jul 02 Python
pytorch实现建立自己的数据集(以mnist为例)
Jan 18 Python
jupyter notebook 参数传递给shell命令行实例
Apr 10 Python
python 模块重载的五种方法
Apr 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编写PDF文档生成器
2006/10/09 PHP
PHP函数utf8转gb2312编码
2006/12/21 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
php中yii框架实例用法
2020/12/22 PHP
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
2013/01/09 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
jQuery遍历节点方法汇总(推荐)
2017/05/13 jQuery
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
Laravel admin实现消息提醒、播放音频功能
2019/07/10 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
使用python实现strcmp函数功能示例
2014/03/25 Python
python格式化字符串实例总结
2014/09/28 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
个人实用的自我评价范文
2013/11/23 职场文书
咨询公司各岗位职责
2013/12/02 职场文书
网上书店创业计划书
2014/01/12 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书
导游词之青岛崂山
2019/12/27 职场文书
python实现监听键盘
2021/04/26 Python
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
Python语言内置数据类型
2022/02/24 Python
详解Python flask的前后端交互
2022/03/31 Python