python如何在循环引用中管理内存
时间:2019-04-13
本文章向大家介绍python如何在循环引用中管理内存,主要包括python如何在循环引用中管理内存使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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 >>>>>')
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- python3使用zookeeper和私钥解密及编码转化配置信息
- Python中os.path.dirname(__file__)的用法
- TensorFlow从0到1 - 18 - TensorFlow 1.3.0安装手记
- Python + Splinter 实现浏览器自动化操作入门指南
- 动态地理信息可视化——leaflet在线地图简介
- python中的递归函数
- 对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析
- 玩转数据地图系列之——地图上的迷你条形图
- 树上倍增求LCA及例题
- 深度强化学习-DDPG算法原理和实现
- 你绝对想不到,数据地图还能这么玩~
- TensorFlow从0到1 - 17 - Step By Step上手TensorBoard
- 深度强化学习-Actor-Critic算法原理和实现
- 深度强化学习-Policy Gradient基本实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- BitMap算法 .net实现 用于去重并且排序,适用于大型权限管理 ,大数据去重排序
- 5.FFMPEG-Qt移植ffmpeg、ffmpeg结构体介绍
- winform总结6=>线程和委托的关系
- winform总结3> 有趣的bat/winform程序完成自己的任务,然后把自己删除
- winform总结2> Action<> ,Action,func<>,委托相关的理解
- winform开发 总结1>winform程序使用线程的必要性,以及正确的使用方式
- Winform 后台将指定的控件集合添加到制定容器中
- C#微信公众平台接入示例代码
- FreeRTOS三种数据结构区别(StreamBuffer,MessageBuffer,Queue)
- Keras & Tensorflow 笔记
- Netty之HTTP协议应用开发
- 超全Python IDE武器库大总结,优缺点一目了然!
- Set源码解析(红黑树)
- RouteOnAttribute
- PutHiveStreaming