Python3 执行图节点goodness迭代计算时触发'float'对象不可下标的TypeError
报错:TypeError: 'float' object is not subscriptable 成因解析
该报错的核心含义是:代码尝试用方括号索引语法(即
对象[键/下标])操作浮点数(float)类型的值,但浮点数本身不支持索引取值操作。
触发报错的完整逻辑链路
- 代码中获取节点入边的语句为
in = G.in_edges(node, data='weight'),该写法对应NetworkX图接口的固定返回规则:当in_edges()方法传入的data参数为具体的单条边属性名(如这里的'weight')时,返回的每条边为长度3的元组,结构是(边起点, 边终点, 对应属性的直接值)。 - 按照这个返回规则,循环遍历边时拿到的
edge[2]本身就是边权重的float数值,不再是存储所有边属性的字典。 - 原代码在计算节点goodness时写的
edge[2]["weight"],默认edge[2]是属性字典,试图从字典里取"weight"键对应的值;但此时edge[2]已经是浮点数,对浮点数执行字典键索引的操作,就会直接触发该TypeError。
可落地的修正方向
- 保留当前
data='weight'的入边获取写法:把权重取值的代码行改为g += fairness[edge[0]] * edge[2],跳过多余的字典索引步骤,直接使用已经拿到的权重值参与计算。 - 保留原代码中
edge[2]["weight"]的取值逻辑:把入边获取的语句改为in_edges(node, data=True),此时方法返回的每条边中edge[2]才是存储所有边属性的字典,可正常通过键取权重值。
注:代码中将内置关键字in作为变量名的写法也存在隐患,后续建议替换为其他变量名避免意外的语法冲突。
内容的提问来源于stack exchange,提问作者Subhash Sagar
相关产品推荐
相关产品推荐

