Python 그래프 자체 순회 및 약한 참조 사용

高洛峰
풀어 주다: 2016-10-19 16:43:32
원래의
1347명이 탐색했습니다.

[파이썬 표준 라이브러리]에서 본 코드가 매우 도움이 되었습니다:

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
로그인 후 복사


시작과 끝의 두 수율은 루프 그래프의 시작점과 끝점으로 한 번만 반환되며 n은 그래프의 가능한 노드입니다

이 반복자를 사용하면 그래프의 구조를 쉽게 인쇄할 수 있습니다:

def __str__(self):

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


그래프:

하나->둘->셋->하나


파이썬에서 약한 참조를 사용해야 하는 그래프 구조를 구현하려면

먼저 그래프 구조에 다음 노드를 추가하는 표준 코드를 살펴보겠습니다.

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을 수동으로 호출하더라도 해당 객체는 삭제되지 않습니다

쓰레기:[,

,

,

{'이름': '하나', '기타': } ,

{'이름': '둘', '기타': },

{'이름': '셋', '기타': }]

약한 참조는 "객체를 참조하지만 참조된 객체의 포인터 수를 늘리지 않음"을 의미합니다.

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()를 통해 다른 객체를 참조할 필요가 없습니다~


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿