我正在使用Python 2.7,我正在尝试实现一个支持union find的节点对象。以下是相关的代码:
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
在这里设置(和重置)对父级的引用的正确方法是什么?
谢谢!
#编辑事实证明我在发布问题时很仓促。分配和重新分配是好的。我在上面报告说,当我指定父母时,自我被重新分配,这是不正确的。我考虑过删除这个问题,但我会将其留在这里有两个原因:
1)人们已经花时间回应,我真的很感激。
2)我认为答案对社区有用,因为它提供了Python中对象引用管理的简明演示。
答案 0 :(得分: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'地址都完全相同。它只是我用Something的构造函数创建并分配给inst