python如何在循环引用中管理内存
作者:北门吹雪 发布时间:2023-12-20 13:18:40
标签: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 >>>>>')
来源:http://www.cnblogs.com/2bjiujiu/p/7289626.html


猜你喜欢
- This is a {t}. {name}是一个很强大的字符串模板解析方法。它接受三个参数,分别是{args.text},{args.obj
- 被分割的字段一定是有限而且数量较少的,我们不可能在一个字符串中存储无限多个字符 这个字段所属的表与这个字段关联的表,一定是一对多的关系 比如
- PHP 301跳转的小代码<?php $the_host = $_SERVER['HTTP
- 引言MySQL数据库读写分离,是提高服务质量的常用手段之一,而对于技术方案,有很多成熟开源框架或方案,例如:sharding-jdbc、sp
- return (1==1) ? "is easy" : "my god" //C#中的用法 其实,在
- 1、视图函数之前的文章说过,在 Flask 中路由是请求的 url 与处理函数之间的映射,使用app.route装饰器将处理函数和 url
- MySQL当url连接不指定/数据库名可以访问到mysql服务器上有权限的任何库,但是所有sql需要加上库名前缀.pom<depend
- ndarray的转置(transpose)对于A是由np.ndarray表示的情况:可以直接使用命令A.T。也可以使用命令A.transpo
- 今天,启动MySQL服务器失败,如下所示:[root@spark01 ~]# /etc/init.d/mysqld startStartin
- 1、手上目前拥有数据集是一大坨,没有train,test,val的划分如图所示2、目录结构:|---data |
- 本文实例讲述了php替换字符串中间字符为省略号的方法。分享给大家供大家参考。具体分析如下:对于一个长字符串,如果你只希望用户看到头尾的部分内
- <script type="text/javascript">一、获取url所有参数值function US
- 关于作者 王丹丹 , IBM 中国系统与技术中心软件工程师,自从 2006 年加入 IBM,一直从事 Web 系统设计和开发工作,有五年 P
- 继上篇Vue 滚动触底 mixins,将对于文档滚动触底的逻辑迁移到某个dom上,将会用到 Vue.directive 来实现代码逻辑复用。
- 大家好,我是丁小杰。上次和大家分享了Python定时爬取微博热搜示例介绍,堪称摸鱼神器,一个热榜不够看?今天我们再来爬取一下抖音热搜榜,感兴
- 什么是迭代器能被 next 指针调用,并不断返回下一个值的对象,叫做迭代器。表示为Iterator,迭代器是一个对象类型数据。概念迭代器指的
- 在numpy的ndarray类型中,似乎没有直接返回特定索引的方法,我只找到了where函数,但是where函数对于寻找某个特定值对应的索引
- Filed under 数据库技术Leave a commentSQL Server命令行导数据两种方式bcp和sqlcmd先说一下bcp:
- 内容摘要:在网页制作中,有许多的术语,例如:CSS、HTML、DHTML、XHTML等等。在下面的文章中我们将会用到一些有关于HTML的基本
- XSS(跨站脚本攻击)作为一种常见的网络安全漏洞,经常被黑客用来攻击网站,Python 是一种十分流行的编程语言,有着丰富的工具库和模块,可