4

私は素晴らしいeric4 ide を使って python をコーディングしていますが、'cyclops' と呼ばれるツールが組み込まれており、明らかにサイクルを探しています。実行すると、コードに多数のサイクルがあることを宣言する大きな太字の赤い文字が表示されます。問題は、出力がほとんど判読できないことです。出力を読んでもサイクルが何であるかを理解する方法はありません。何時間も Web をブラウジングしましたが、ブログ記事ほど多くは見つかりませんでした。サイクルが特定のポイントまで積み重なると、プロファイラーとデバッガーは動作を停止します:(。

私の質問は、サイクルとは何か、いつサイクルを作成するのかを知る方法、Python でサイクルを作成しないようにする方法です。ありがとう。

4

2 に答える 2

4

サイクル (または「参照ループ」) は、相互に参照する 2 つ以上のオブジェクトです。たとえば、次のようになります。

alist = []
anoth = [alist]
alist.append(anoth)

また

class Child(object): pass

class Parent(object): pass

c = Child()
p = Parent()
c.parent = p
p.child = c

もちろん、これらは非常に単純な例で、サイクルは 2 つのアイテムだけです。実際の例は、多くの場合、より長く、見つけにくいものです。サイクルを作成したことを示す魔法の弾丸はありません。ただ、それを監視する必要があります。gcモジュール (特定のジョブは、到達不能なサイクルをガベージ コレクションすることです) は、既存のサイクルを診断するのに役立ちます (適切なデバッグ フラグを設定すると)。weakrefモジュールは、参照サイクルを作成せずに (たとえば) 子と親がお互いについて知る必要がある場合に、サイクルの構築を回避するのに役立ちます (2 つの相互参照の 1 つだけを弱い参照またはプロキシにするか、モジュールが提供する便利な弱い辞書コンテナー)。

于 2009-11-05T18:46:39.580 に答える
1

すべての Cyclops は、コード内に他のオブジェクトのチェーンを介して自分自身を参照するオブジェクトがあるかどうかを示します。ガベージ コレクターがこの種のオブジェクトを正しく処理しないため、これは以前は Python の問題でした。その後、この問題はほとんど修正されました。

結論: メモリ リークが発生していない場合、ほとんどの場合、Cyclops の出力について心配する必要はありません。

于 2009-11-05T18:44:01.223 に答える