Python类中如何在一个方法中引用另一个方法生成的列表
问题原因与修复方案
核心问题
- 你在
build_index方法中定义的points是局部变量,仅在该方法运行期间有效,方法执行结束后就会被回收,其他方法无法直接访问 build_index的形参也命名为points,方法内部又直接执行points = []赋值,完全覆盖了传入的参数,这部分逻辑是冗余无效的search方法中直接调用points变量,Python找不到该变量的作用域,自然会抛出变量未定义的错误
另外你原有search方法的逻辑存在功能缺陷:当前仅存储并返回了距离值,没有绑定对应的Point对象,和你标注的[Point]返回类型不符。
修复方案
修改逻辑为将构建好的points列表存为实例属性,用self.前缀修饰,即可跨方法共享访问,同时修正search的功能逻辑:
class naiveNN(nearestneigh): def build_index(self): # 把points存为实例属性,其他方法可以通过self.points访问 self.points = [] with open('sampleData.txt', 'r') as file: for line in file: line = line.strip('\n').split(' ') point_id = line[0] cat = line[1] lat = line[2] lon = line[3] point = Point(point_id, cat, lat, lon) self.points.append(point) return self.points def search(self, search_term: Point, k: int) -> [Point]: # 存为(距离, 点对象)的元组,排序后可以直接拿到对应的Point distance_neigh = [] for point in self.points: distance = Point.dist_to(point, search_term) distance_neigh.append((distance, point)) # 按距离排序后提取前k个对应的Point对象返回 sorted_nigh = [item[1] for item in sorted(distance_neigh)[:k]] return sorted_nigh
使用时需要先调用
build_index初始化索引,再调用search方法查询,示例:nn = naiveNN() nn.build_index() result = nn.search(待查询的Point对象, 5)
内容的提问来源于stack exchange,提问作者vitaminSí
相关产品推荐
相关产品推荐

