ホームページ  >  記事  >  バックエンド開発  >  Python グラフの自己走査と弱参照の使用

Python グラフの自己走査と弱参照の使用

高洛峰
高洛峰オリジナル
2016-10-19 16:43:321298ブラウズ

[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 つの利回りは、サイクルの開始点と終了点として 1 回だけ返されます。グラフ、n はグラフ 可能なノード、次の呼び出しで毎回次のノードが返されます

このイテレータを使用すると、グラフの構造を簡単に出力できます:

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)

other = other


このようにバインドした後、属性フィールドに次のノードへの参照を追加します

c.__dict__

{'other': 、「名前」 : '1'}


そのため、a = None、b = None、c = None を手動で呼び出しても、オブジェクトは削除されません

Garbage:[,

,

,

{'名前': '1', 'その他': },

{'名前': '2', 'その他': },

{'名前': '3', 'その他' : }]

そして、弱い参照とは、「オブジェクトを参照するが、参照されるオブジェクトのポインタ数を増加させない」ことを意味します

c = Weekref.ref(k,func)

を使用して、参照されるオブジェクトを指定できますそして、オブジェクト削除後のアクション func

call この場合、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()~


を介して他のオブジェクトを参照することを回避します
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。