You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:55:26