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

这不起作用:-(

如果不清楚,我的意思是最初创建一个节点,该节点包含对其父节点的引用,该父节点最初只是它自己(因为它是集群中的唯一节点)。但是,当我尝试在联合操作中重新分配 self.parent 时,我最终会重新分配 self。我很确定这是因为我在init中设置引用的方式:

self.parent = self

在这里设置(和重置)对父级的引用的正确方法是什么?

谢谢!

# 编辑

事实证明我在发布问题时很仓促。分配和重新分配都很好。我在上面报告说,当我分配父母时,自我正在被重新分配,这是不正确的。我考虑删除这个问题,但出于两个原因,我将把它留在这里:

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”地址将完全相同。它只是对我使用Something的构造函数创建并分配给的对象的引用inst

于 2013-09-13T16:09:53.297 回答