实现Graph类对比BFS与Prim算法时触发Graph对象不可下标的TypeError
根本原因解析
- 触发
TypeError: 'Graph' object is not subscriptable的核心是代码的对象引用层级错误:get_neighbours方法中编写的self[i][e]逻辑,将Graph类实例本身当成了可下标访问的邻接矩阵数组,但自定义Python类默认不支持[]下标取值操作(即可被下标索引),因此直接抛出类型错误。 - 项目中采用邻接矩阵结构存图时,邻接矩阵是作为Graph类的实例属性存储的(通常命名为
adj/adj_matrix等),并非Graph实例本身。之前的错误本质是跳过了属性引用环节,直接对类实例做下标操作。
针对性修复方案
- 直接修正邻接边的访问路径:将原代码中
self[i][e]的写法,替换为对实际存储邻接矩阵的属性的访问,例如邻接矩阵存储在self.adj_matrix中时,对应判断逻辑改写为self.adj_matrix[i][e],匹配邻接矩阵“第一维为顶点i的邻接行、第二维为顶点e对应边权重”的常规存储结构。 - 若需保留原有的
self[i][e]写法,可给Graph类实现__getitem__魔术方法,让类实例本身支持下标访问:
这种写法虽然能快速跑通代码,但更推荐使用明确的属性访问逻辑,减少魔术方法带来的代码阅读歧义。class Graph: def __getitem__(self, index): # 下标访问时直接返回邻接矩阵对应索引的行数据 return self.adj_matrix[index]
后续校验要点
- 修复后需确认邻接矩阵的存储结构与顶点编号完全匹配:保证
adj_matrix[i][e]对应顶点i和顶点e之间的边权重,避免索引错位导致的邻接关系判断错误。 - 可快速校验实例属性类型:实例化Graph对象后,打印邻接矩阵属性的类型,确认其为list、numpy数组这类本身支持下标访问的结构,排除多层对象嵌套导致的二次下标错误。
内容的提问来源于stack exchange,提问作者Yinbel
相关产品推荐
相关产品推荐

