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文件
Apr 15 Python
Python yield 使用方法浅析
May 20 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
python模拟表单提交登录图书馆
Apr 27 Python
用Python写一个模拟qq聊天小程序的代码实例
Mar 06 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
利用django model save方法对未更改的字段依然进行了保存
Mar 28 Python
Python gevent协程切换实现详解
Sep 14 Python
python实现图像高斯金字塔的示例代码
Dec 11 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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
Oracle 常见问题解答
2006/10/09 PHP
php获取系统变量方法小结
2015/05/29 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
js判断变量是否空值的代码
2008/10/26 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
微信小程序 LOL 英雄介绍开发实例
2016/09/30 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
python实现查找所有程序的安装信息
2020/02/18 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Python3开发环境搭建详细教程
2020/06/18 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
平面设计岗位职责
2013/12/14 职场文书
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
竟聘演讲稿范文
2013/12/31 职场文书
广告设计应届生求职信
2014/03/01 职场文书
我们的节日清明节活动方案
2014/03/05 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
清洁工个人总结
2015/03/04 职场文书
储备店长岗位职责
2015/04/14 职场文书
课改心得体会范文
2016/01/25 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python