Python不返回相同的对象?

Python不返回相同的对象?,python,Python,这是我的密码: class Node: nodes = {} def __init__(self, name): self.name = name self.parent = [] self.children = [] Node.nodes[self.name] = self def addParent(self, parent): print "adding parent %s for

这是我的密码:

class Node:
    nodes = {}

    def __init__(self, name):
        self.name = name
        self.parent = []
        self.children = []

        Node.nodes[self.name] = self

    def addParent(self, parent):
        print "adding parent %s for %s " % (parent, self.name)
        self.parent.append(parent)
        print self.parent

    def addChild(self, child):
        self.children.append(child)

    def removeParent(self, parent):
        try:
            self.parent.remove(parent)
        except:
            pass

    def removeChild(self, child):
        try:
            self.children.remove(child)
        except:
            pass

def lookup(obj):
    print "calling look up"
    Node.nodes.get(obj)

def create_node(obj):
    return lookup(obj) or Node(obj)

# Tree has Nodes
class Tree:
    trees = {}

    def __init__(self, name, root):
        self.name = name
        self.root = root
        self.size = 1
        self.nodes = set() # tree has unique nodes

        self.nodes.add(root)
        Tree.trees[self.name] = self

    def addNode(self, node):
        self.nodes.add(node)
        self.size += 1

    def removeNode(self, node):
        try:
            self.nodes.remove(node)
        except:
            return
        self.size -= 1

    def setRoot(self, root):
        self.root = root

    def print_tree(self):
        for i in self.nodes:
            if i == self.root.name:
                print "root: %s" % i
            else:
                print i

def main():
    roota = create_node("a")
    ta = Tree("a", roota)

    childaa = create_node("a_a")
    roota.addChild(childaa)
    childaa.addParent(roota)
    ta.addNode(childaa)

    childab = create_node("a_b")
    roota.addChild(childab)
    childab.addParent(roota)
    ta.addNode(childab)


    # make one of the child of a root
    rootb = create_node("a_a")  # should give me a node that already exists from the above tree
    tb = Tree("a_a", rootb)

    childbb = create_node("a_b") # this node should have two parents now, a and a_a
    rootb.addChild(childbb)
    childbb.addParent(rootb)
    tb.addNode(childbb)

    for node in Node.nodes.itervalues():
        print "Name: %s" % node.name
        if node.parent:
            print "Parent: %s" % [parent.name for parent in node.parent]
        else:
            print "Parent: %s" % node.parent
        print "Children: ", [node.name for node in node.children]
        print ""

if __name__ == '__main__':
    main()
以及脚本的输出:

Name: a  
Parent: []  
Children:  ['a_a', 'a_b']  

Name: a_a  
Parent: []  
Children:  ['a_b']  

Name: a_b  
Parent: ['a_a']  
Children:  []  
Name: a  
Parent: []  
Children:  ['a_a', 'a_b']  

Name: a_a  
Parent: ['a']  
Children:  ['a_b']  

Name: a_b  
Parent: ['a', 'a_a']  
Children:  []  
a_a
应该有父
a
。第80行添加了
a
作为
a\u a

a\u b
应具有父级
a\u a
a
。第85行添加了
a
作为
a\u b

有人能给我解释一下为什么在这个代码中不是这样的吗

并希望得到脚本的输出:

Name: a  
Parent: []  
Children:  ['a_a', 'a_b']  

Name: a_a  
Parent: []  
Children:  ['a_b']  

Name: a_b  
Parent: ['a_a']  
Children:  []  
Name: a  
Parent: []  
Children:  ['a_a', 'a_b']  

Name: a_a  
Parent: ['a']  
Children:  ['a_b']  

Name: a_b  
Parent: ['a', 'a_a']  
Children:  []  

树是有向循环自由图。树的每个节点本身就是一棵树,因此树和节点不需要两个类(除非您希望为树提供一些元信息)

跟踪子对象或父对象就足够了,但为了方便起见(例如,在两个方向上横穿树),您可以同时保存这两个对象。但是如果你这样做了,你必须注意isParent(a,b)与isChild(b,a)的同义反复。在您的代码中,如果您添加了一个节点,但没有手动设置其父节点,那么您的树就会失控

如果我们谈论的是树,那么“这个节点现在应该有两个父节点,a和a”就没有多大意义了

基本树结构如下所示(不验证周期):

例如:

root = Tree ('root')
a = Tree ('A')
b = Tree ('B')
c = Tree ('C')
root += a
root += b
b += c

root.pprint ()
c.detach ()
a += c
root.pprint ()

我希望你能从这个片段中获得一些关于如何构建树的想法。

请不要使用
,除非:pass
。它真的吞噬了一切,包括系统退出和键盘中断。如果确实要忽略所有实际异常,请使用
Exception:pass
。但即使这样也不是一个好主意-
ValueError
是您所需要的一切,您采取了哪些步骤试图找出错误?我们可以搜索代码并找到bug,但最好是你自己学会如何找到它。@RyanHaining好的,我不知道。谢谢。您可以使用
print rootb is childaa
检查它是否是同一个对象。如果打印为False,则它们是不同的对象。在您的情况下,它确实打印错误。为了找出原因,我将在
create_node
中添加print语句,以查看其中发生的事情与您预期的不同。请仔细查看查找。最后一行你少了一些非常重要的东西。