0

Python 2.7 を使用しており、ユニオン検索をサポートするノード オブジェクトを実装しようとしています。関連するコードは次のとおりです。

class Node:
    def __init__(self, nodeID):
        self.nodeID = nodeID
        self.parent = self
        self.size = 1 

    def __repr__(self):
        return "<node nodeID: %d clusterID: %d clusterSize: %d>" 
                               % (self.nodeID, self.clusterID(), self.clusterSize())

   def union(self, other):
       '''someNode.union(otherNode) joins two nodes by attaching the parent of 
       the node with the smaller cluster size beneath the parent of the larger node.
       If nodes have equal cluster size, otherNode is joined below someNode'''

       selfLeader = self.find() #top node of self
       selfCID = selfLeader.nodeID 
       otherLeader = other.find() #top node of other
       otherCID = otherLeader.nodeID
       if (selfCID == otherCID):
            return
       elif (selfLeader.size <= otherLeader.size):
            otherLeader.size += selfLeader.size
            selfLeader.parent = otherLeader
       else:
            selfLeader.size += otherLeader.size
            otherLeader.parent = selfLeader

これは機能しません:-(

明確でない場合は、最初に、親ノードへの参照を保持するノードを作成することを意味します。これは、最初はそれ自体です (クラスター内の唯一のノードであるため)。ただし、union 操作で self.parent を再割り当てしようとすると、self を再割り当てしてしまいます。これは、 initで参照を設定する方法が原因であると確信しています:

self.parent = self

ここで親への参照を設定 (およびリセット) する正しい方法は何ですか?

ありがとう!

# 編集

質問を投稿するのを急いでいたことがわかりました。割り当てと再割り当ては問題ありません。上記で、親を割り当てたときに自己が再割り当てされていると報告しましたが、これは正しくありません。質問を削除することも検討しましたが、次の 2 つの理由からここに残します。

1) すでに時間を割いて回答してくださっていること、本当に感謝しています。

2) Python でのオブジェクト参照管理の簡潔なデモンストレーションを提供するという点で、この回答はコミュニティに役立つと思います。

4

1 に答える 1

2

やっても問題ありませんself.parent = self。オブジェクトは、それ自体への参照を保持する属性を簡単に持つことができ、問題はまったくありません。次のテスト コードを検討してください。

class Something:
    def __init__(self):
        self.parent = None

    def setParent(self, parent=None):
        self.parent = self if not parent else parent

inst = Something()
print inst # prints <__main__.Something instance at 0xblah>
print inst.parent # prints None
inst.setParent()
print inst.parent # prints <__main__.Something instance at 0xblah>
inst.setParent(inst)
print inst.parent # prints <__main__.Something instance at 0xblah>

その例では、すべての「0xblah」アドレスがまったく同じになります。何かのコンストラクターで作成して割り当てたオブジェクトへの参照ですinst

于 2013-09-13T16:09:53.297 に答える