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 >>>>>')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
  • Python内存管理方式和垃圾回收算法解析
  • Python深入06——python的内存管理详解
  • 从Python的源码浅要剖析Python的内存管理
  • python内存管理分析
  • Python深入学习之内存管理
(0)

相关推荐

  • Python和Ruby中each循环引用变量问题(一个隐秘BUG?)

    虽然这个问题我是在 Python 里遇到的,但是用 Ruby 解释起来比较容易一些.在 Ruby 里,遍历一个数组可以有很多种方法,最常用的两种无非是 for 和 each: 复制代码 代码如下: arr = ['a', 'b', 'c'] arr.each { |e|  puts e} for e in arr  puts eend 通常我比较喜欢后者,似乎因为写起来比较好看,不过从效率上来说前者应该会稍微快一点,因为后者实际上是在遍历的过程中对每个元素都调用一个 lambda 函数来做的,虽

  • Python深入学习之内存管理

    语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面向对象的语言的内存管理方式.  对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python的赋值语句就很值得研究. a = 1 整数1为一个对象.而a是一个引用.利用赋值语句,引用a指向对象1.Python是动态类型的语言(参考动态类型),对象与引用分离.Pytho

  • Python深入06——python的内存管理详解

    语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面向对象的语言的内存管理方式. 对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python的赋值语句就很值得研究. a = 1 整数1为一个对象.而a是一个引用.利用赋值语句,引用a指向对象1.Python是动态类型的语言(参考动态类型),对象与引用分离.Python

  • 从Python的源码浅要剖析Python的内存管理

    Python 的内存管理架构(Objects/obmalloc.c): 复制代码 代码如下: _____   ______   ______       ________    [ int ] [ dict ] [ list ] ... [ string ]       Python core         | +3 | <----- Object-specific memory -----> | <-- Non-object memory --> |     _________

  • python内存管理分析

    本文较为详细的分析了python内存管理机制.分享给大家供大家参考.具体分析如下: 内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在Python的运行中,会创建和销毁大量的对象,这些都涉及到内存的管理. 小块空间的内存池 在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制. Python内存池全景 这就意味着Python在

  • Python内存管理方式和垃圾回收算法解析

    概要 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 __del__ 方法的实例会以健全的方式被处理.给新类型添加GC支持是很容易的.支持GC的Python与常规的Python是二进制兼容的. 分代式回收能运行工作(目前是三个分代).由 pybench 实测的结果是大约有百分之四的开销.实际上所有的扩展模块都应该依然如故地正常工作(我不得不修改了标准发行版中的 new 和 cPickle 模块).一个叫做 gc 的新模块马上就可以用来调试回收器和设置调试选项. 回收器应该是跨平台可移植

  • python如何在循环引用中管理内存

    python中通过引用计数来回收垃圾对象,在某些环形数据结构(树,图--),存在对象间的循环引用,比如树的父节点引用子节点,子节点同时引用父节点,此时通过del掉引用父子节点,两个对象不能被立即释放 需求: 如何解决此类的内存管理问题? 如何查询一个对象的引用计数? import sys sys.getrefcount(obj) # 查询引用计数必多 1 ,因为object也引用 查询对象 如何解决内存管理问题? 通过weakref,进行弱引用,当del时候,不再引用,在引用方添加weakref

  • C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题. // // main.cpp // test // // Created by 杜国超 on 17/9/9. // Copyright © 2017年 杜国超. All rights reserved. // #include <iostream> #include <memory> #include <vector>

  • 权威JavaScript 中的内存泄露模式

    作者:Abhijeet Bhattacharya (abhbhatt@in.ibm.com), 系统软件工程师, IBM IndiaKiran Shivarama Shivarama Sundar (kisundar@in.ibm.com), 系统软件工程师, IBM India 2007 年 5 月 28 日 如果您知道内存泄漏的起因,那么在 JavaScript 中进行相应的防范就应该相当容易.在这篇文章中,作者 Kiran Sundar 和 Abhijeet Bhattacharya 将带

  • Python中循环引用(import)失败的解决方法

    前言 最近在开发智能家居项目hestia-rpi项目中,由于代码结构层级划分不合理,导致了循环引用(import)module失败的问题,错误如下: Traceback (most recent call last):   File "./main.py", line 8, in &lt;module&gt;     from hestiarpi.library.server import server   File "/home/pi/server/hest

  • iOS中wkwebView内存泄漏与循环引用问题详解

    前言 现在大多数网络也面加载都会用到wkwebview,之前在使用wkwebview的时候,网上很多的基础教程使用很多只是说了怎么添加Message Handler 但是并没有告诉到家有这个内存泄漏的风险,如果你只是也没内的数据调用你压根都不会发现这个问题.没存泄漏这个问题说大不大,说小不小,严重的话话直接到时app闪退,所以还是得重视起.好下面说一下怎么解决,话不多说了,来一起看看详细的介绍吧 解决方法 1,在做网页端js交互的时候 我们都会这样去添加js [self.customWebVie

  • Python中的内存管理之python list内存使用详解

    前言 使用 Python 的时候,我们知道 list 是一个长度可变对的数组, 可以通过 insert,append 和 extend 轻易的拓展其中的元素个数. 也可以使用运算符 如: [1] + [2] 生成新的数组[1, 2] extend(). "+"."+=" 的区别 "+"将两个 list 相加,会返回到一个新的 list 对象 append 在原 list 上进行修改,没有返回值 从以下代码可以看到, 调用 b = b + [3,

  • Swift中如何避免循环引用的方法

    内存管理中经常会遇到的一个问题便是循环引用.首先,我们来了解一下iOS是如何进行内存管理的. 和OC一样,swift也是使用自动引用计数ARC(Auto Reference Counteting)来自动管理内存的,所以我们不需要过多考虑内存管理.当某个类实例不需要用到的时候,ARC会自动释放其占用的内存. ARC ARC(Automatic Reference Counting) 是苹果的自动内存管理机制.正如其名:自动引用计数,根据引用计数来决定内存块是否应该被释放. 当一个对象被创建的时候,

  • 中高级前端必须了解的JS中的内存管理(推荐)

    前言 像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()用于分配内存和释放内存. 而对于JavaScript来说,会在创建变量(对象,字符串等)时分配内存,并且在不再使用它们时"自动"释放内存,这个自动释放内存的过程称为垃圾回收. 因为自动垃圾回收机制的存在,让大多Javascript开发者感觉他们可以不关心内存管理,所以会在一些情况下导致内存泄漏. 内存生命周期 JS 环境中分配的内存有如下声明周期: 1.内存分配:当我们申明变量.函数.对象的时候

  • 解析PHP中的内存管理,PHP动态分配和释放内存

    摘要 内存管理对于长期运行的程序,例如服务器守护程序,是相当重要的影响:因此,理解PHP是如何分配与释放内存的对于创建这类程序极为重要.本文将重点探讨PHP的内存管理问题. 一. 内存在PHP中,填充一个字符串变量相当简单,这只需要一个语句"<?php $str = 'hello world '; ?>"即可,并且该字符串能够被自由地修改.拷贝和移动.而在C语言中,尽管你能够编写例如"char *str = "hello world ";&qu

  • 深入探讨PHP中的内存管理问题

    一. 内存 在PHP中,填充一个字符串变量相当简单,这只需要一个语句"<?php $str = 'hello world '; ?>"即可,并且该字符串能够被自由地修改.拷贝和移动.而在C语言中,尽管你能够编写例如"char *str = "hello world ";"这样的一个简单的静态字符串:但是,却不能修改该字符串,因为它生存于程序空间内.为了创建一个可操纵的字符串,你必须分配一个内存块,并且通过一个函数(例如strdup()

随机推荐