python 图 自身遍历及弱引用使用

在【python 标准库】中看到的一段代码,非常有帮助:

def all_nodes(self):        yield self        n = self.other        while n and n.name != self.name:            yield n            n = n.other        if n is self:            yield n        return

登录后复制

   

首尾的2处yield均只返回一次,作为循环图的起点、终点,而n作为图可能的节点,每次在next调用中均返回next节点

利用这个迭代器,就可以轻松打印出图的结构:

立即学习“Python免费学习笔记(深入)”;

def __str__(self):

       return ‘->’.join((n.name for n in self.all_nodes()))

Graph:

one->two->three->one

实现一个图结构需要利用python里面的弱引用,

我们先看一下标准的向图结构中增加下一节点的代码:

def set_next(self, other):

       print ‘%s.next %r’ % ( self.name, other)

       self.other = other

这样绑定后,在属性字段中,增加一个对于下一节点的引用

c.__dict__

{‘other’: , ‘name’: ‘1’}

所以,即使手动调用了 a = None, b = None, c = None,对象也不会被删除

Garbage:[,

,

,

{‘name’: ‘one’, ‘other’: },

{‘name’: ‘two’, ‘other’: },

{‘name’: ‘three’, ‘other’: }]

而弱引用是指“引用一个对象,但并不增加被引用对象的指针计数”

可以通过c = weekref.ref(k,func)  

来指定引用的对象及对象删除后的动作func

调用时,使用c() 来引用k

但是在上个例子里面,我们需要一个“代理对象”来代理这个被引用的对象,从而使set_next 函数对于变量other可以同正常变量一样使用

def set_next(self, other):        if other is not None:            if self in other.all_nodes():                other = weakref.proxy(other)        super(WeakGraph, self).set_next(other)        return

登录后复制

   

从而避免了通过other()来引用一个other对象~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2283570.html

(0)
上一篇 2025年2月27日 20:14:39
下一篇 2025年2月26日 04:00:51

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python图像文字识别

    最近在想没有一个图片文字识别的工具呢?我想到了ocr,国内比较牛逼的汉王ocr。那借助python能否实现呢?于是我找啊找查啊查有关python在这方面探讨的资料,发现pytesser 这样一个好玩的程序!拿出来分享讨论一下: PyTess…

    编程技术 2025年2月27日
    200
  • 深入理解python函数传参机制

    首先需要申明的一点是,python里是没有像c和c++里那样按值传参的说法的。python中的所有东西都是对象,这也是它的强大之处,它没有基本类型之说。 在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸…

    编程技术 2025年2月27日
    200
  • Python命名空间实例解析

    python的命名空间是python程序猿必须了解的内容,对python命名空间的学习,将使我们在本质上掌握一些python中的琐碎的规则。 接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的查找顺序;三、…

    编程技术 2025年2月27日
    200
  • python魔术方法详解

    准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始。 class NewType(Object):  mor_code_hereclass OldType:  mor_code_here 登录后复制…

    编程技术 2025年2月27日
    200
  • python清空字典的两种方法比较

    python清空字典的两种方法比较 这里说的clear是指清空python中的字典内容,与删除该字典不一样。 例如: d={‘name’:1,’age’:2} 想要清空该字典有两个方法 立即学…

    编程技术 2025年2月27日
    200
  • python异常大总结

    python用异常对象(exception object)来表示异常情况。遇到错误后,会引发异常。如果异常对象并未被处理或捕捉,程序就会用所谓的 回溯(traceback, 一种错误信息)终止执行: >>> 1/0 Tra…

    编程技术 2025年2月27日
    200
  • Python 开发者在迁移到 Go 前需要知道的事情

    这是一篇记录了我们把一大段 python/cython 代码迁移到 go语言经历的(长)博客。如果你希望了解整个故事、背景等所有的内容,请接着读。如果只对 python 开发者进入之前需要知道的东西感兴趣,点击下面的链接: 从 Python…

    编程技术 2025年2月27日
    200
  • python异常处理详解

    本节主要介绍python中异常处理的原理和主要的形式。 1、什么是异常 Python中用异常对象来表示异常情况。程序在运行期间遇到错误后会引发异常。如果异常对象并未被处理或捕获,程序就会回溯终止执行。 2、抛出异常 raise语句,rais…

    编程技术 2025年2月27日
    200
  • python字符串处理函数大总结

    str=’python string function’ 生成字符串变量str=’python string function’ 字符串长度获取:len(str) 例:print &#8216…

    编程技术 2025年2月27日
    200
  • python获取网络时间和本地时间

    今天我们来看一下如何用python获取网络时间和本地时间,直接上代码吧,代码中都有注释。 python获取网络时间 获取网络时间 def getBeijinTime():     “””    获取北京时间     “””     try:…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论