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 14 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
在Python中定义一个常量的方法
Nov 10 Python
python+opencv像素的加减和加权操作的实现
Jul 14 Python
Django ORM 查询管理器源码解析
Aug 05 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
一文了解python 3 字符串格式化 F-string 用法
Mar 04 Python
Python使用xlrd实现读取合并单元格
Jul 09 Python
python 实现汉诺塔游戏
Nov 28 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 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
在Windows中安装Apache2和PHP4的权威指南
2006/10/09 PHP
PHP基本语法总结
2014/09/06 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
python与C互相调用的方法详解
2017/07/14 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
在职研究生自我鉴定
2013/10/16 职场文书
经贸日语毕业生自荐信
2013/11/03 职场文书
制冷与电控专业应届生求职信
2013/11/11 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
伊琍体标语
2014/06/25 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python
Java设计模式之代理模式
2022/04/22 Java/Android