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语句,以查看其中发生的事情与您预期的不同。请仔细查看查找。最后一行你少了一些非常重要的东西。