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