为何报错AttributeError:bubbleSort类无array属性?
问题分析与解决
1. 直接触发报错的原因
你最后一行代码写的是print(bubbleSort.array),这里犯了核心错误:array是实例属性,不是类属性。你已经创建了类的实例new = bubbleSort(10),必须访问实例的属性才能拿到数组,改成:
print(new.array)
类本身(bubbleSort)并没有array属性,只有类的实例(new)才会在初始化时生成这个属性,这就是AttributeError的根源。
2. 冒泡排序逻辑的其他问题
除了上述报错,你的sort方法里还有多处逻辑错误,导致排序无法正常工作:
- 数组引用混乱:
self.sorted = self.array是直接赋值引用,修改self.sorted时会同步改动原self.array,应该改成拷贝:self.sorted = self.array.copy() - 索引越界风险:
for i in range(self.size)会让i取到self.size-1,此时i+1等于数组长度,超出索引范围,应该改成range(self.size - 1) - 未定义变量:代码里
self.sorted[i] > [self.tmp]中的self.tmp从未定义,属于完全错误的比较逻辑 - 排序逻辑颠倒:冒泡排序的规则是左边元素大于右边时交换,你当前的
else分支才执行交换,逻辑完全反了 - 终止条件错误:
self.equal初始设为False,后续又用self.equal +=1,类型混乱,应该每次遍历前重置为0,统计无需交换的次数,当次数等于数组长度-1时,说明数组已经有序
修正后的完整代码
from random import randint class bubbleSort: def __init__(self, size): self.size = size # 数组大小 self.array = [] # 随机生成的原数组 # 拷贝原数组作为待排序数组,避免修改原数组 self.sorted = self.array.copy() self.count = 0 # 生成不重复的随机数组 while self.count != self.size: random_num = randint(1, self.size) if random_num not in self.array: self.array.append(random_num) self.count += 1 def sort(self): # 重置排序数组(支持重复调用sort方法) self.sorted = self.array.copy() done = False while not done: equal_count = 0 # 统计无需交换的次数 # 遍历到倒数第二个元素,避免i+1越界 for i in range(self.size - 1): if self.sorted[i] > self.sorted[i+1]: # 交换相邻元素 self.sorted[i], self.sorted[i+1] = self.sorted[i+1], self.sorted[i] else: equal_count += 1 # 所有相邻元素都无需交换,说明数组有序 if equal_count == self.size - 1: done = True # 创建实例并测试 new = bubbleSort(10) print("原数组:", new.array) new.sort() print("排序后数组:", new.sorted)
测试说明
运行上述代码后,会先打印生成的随机数组,再输出排序后的结果,同时不会再出现属性错误。
内容的提问来源于stack exchange,提问作者Mus'Ab Al-Bahry
相关产品推荐
相关产品推荐

