Python邻接表图添加节点显示对象而非字符串问题求助
Python邻接表图实现的错误修复
问题总结
你遇到两个核心问题:
- 打印节点时显示的是Node对象的内存地址(如
<__main__.Node object at 0x0000...>),而非节点名称字符串 - 调用
listNodes()方法时触发TypeError: list indices must be integers or slices, not Node
错误原因与修复方案
1. Node对象显示为内存地址的问题
Python默认打印对象时,会输出其类名和内存地址。要让打印Node时显示名称,只需给Node类添加__str__方法,自定义对象的字符串表示:
class Node: # 原有代码不变 def __str__(self): return self.name
2. listNodes方法的TypeError错误
listNodes里的循环逻辑完全错误:for i in self.nodeList遍历的是列表中的元素(要么是Node对象,要么是初始的0),你却用self.nodeList[i]去索引列表,这自然会报错——因为i不是整数索引。
另外,self.nodeList里只有前self.numNodes个元素是有效的Node对象,后面的都是初始化的0,所以应该只遍历有效节点:
def listNodes(self): theList = "Nodes: " # 只遍历前numNodes个有效节点 for i in range(self.numNodes): theList += str(self.nodeList[i]) + " " return theList
3. 其他冗余与逻辑问题
addNode方法里newNode.name = name是冗余代码,Node(name)初始化时已经设置了name属性,直接删掉即可。- 当前
newNode.addNeighbor(name)是把字符串添加到邻接表,不符合邻接表的常规设计(应该存储Node对象),如果需要正确维护邻接关系,可改为newNode.addNeighbor(newNode)(示例为自环测试,后续添加其他节点时传入对应Node实例即可)。
修改后的完整代码
class Node: def __init__(self, name): self.name = name self.visited = False self.adjacency = [] def addNeighbor(self, v): if v not in self.adjacency: self.adjacency.append(v) def __str__(self): return self.name class DGraph: def __init__(self, size=20): self.size = size self.numNodes = 0 self.nodeList = [0] * size def addNode(self, name): """adds new node to graph""" if self.numNodes >= self.size: raise OverflowError("Graph Size Exceeded") newNode = Node(name) newNode.addNeighbor(newNode) self.nodeList[self.numNodes] = newNode self.numNodes += 1 def listNodes(self): theList = "Nodes: " for i in range(self.numNodes): theList += str(self.nodeList[i]) + " " return theList tree = DGraph() tree.addNode("A") tree.addNode('C') tree.addNode('T') # 测试打印节点 print(tree.listNodes()) # 输出:Nodes: A C T # 测试单个节点打印 print(tree.nodeList[0]) # 输出:A
内容的提问来源于stack exchange,提问作者Sage
相关产品推荐
相关产品推荐

