Python哈希表实现中已定义linear_probe仍报未定义错误排查
问题原因分析
核心原因:实例方法调用方式错误
linear_probe是hash_table类的实例方法,Python 中所有类实例方法的第一个参数self都指代当前调用方法的实例,通过实例调用方法时,Python 会自动将实例作为self参数传入,不需要手动填写。
从助教提供的运行日志可以直接看出问题:
hash_table(8) linear_probe(16, 0)error when running hash(16)- CORRECT
日志里的调用逻辑是:先创建了一个hash_table实例但没有赋值给变量保存,接着直接在全局作用域调用linear_probe函数,全局作用域下根本没有定义这个函数,自然会报「linear_probe 未定义」的错误。
而你在hash方法内部调用self.linear_probe(value,slot)是正确的绑定实例的调用方式,self就是当前hash_table实例,Python 自动完成了参数传递,所以不会报错。
正确的单独调用linear_probe的写法应该是:
# 第一步:创建实例并保存到变量 ht = hash_table(8) # 第二步:通过实例调用方法,自动传入self参数 ht.linear_probe(16, 0)
如果要直接通过类名调用,需要手动把实例作为第一个参数传入:
ht = hash_table(8) hash_table.linear_probe(ht, 16, 0)
补充潜在问题:哈希表满时会触发死循环
你的linear_probe方法没有处理哈希表全满的边界情况:如果所有槽位都已经被占用,不存在值为None的位置,while self.table[next_index] != None的循环条件会永远成立,方法会进入无限循环直到运行超时被终止,也会表现为运行报错。你自己的测试用例都没有把哈希表插满,所以不会触发这个问题,日志里部分调用正常、部分报错的现象也符合这个边界问题的触发特征。
内容的提问来源于stack exchange,提问作者kjrm
相关产品推荐
相关产品推荐

