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中shutil模块的常用文件操作函数用法示例
Jul 05 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
Python numpy 点数组去重的实例
Apr 18 Python
python实现爬取图书封面
Jul 05 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
python实现一个函数版的名片管理系统过程解析
Aug 27 Python
Python imread、newaxis用法详解
Nov 04 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
python梯度下降算法的实现
Feb 24 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
python爬虫---requests库的用法详解
Sep 28 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的错误信息
2006/10/09 PHP
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
php格式化金额函数分享
2015/02/02 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
基于Javascript倒计时效果
2016/12/22 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
win10安装python3.6的常见问题
2020/07/01 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
女大学生个人求职信
2013/12/09 职场文书
欢迎领导检查标语
2014/06/27 职场文书
仰望星空观后感
2015/06/10 职场文书
Nginx快速入门教程
2021/03/31 Servers