使用筛法生成不超过n的素数时报bool对象不可下标错误如何解决?
错误原因
你遇到的TypeError: 'bool' object is not subscriptable错误核心原因是内层筛除逻辑的赋值操作错误:
- 内层
for j循环中的代码is_prime = False直接把原本是布尔列表的is_prime变量整体覆盖成了单个布尔值False - 第一次执行完这行赋值后,
is_prime就不再是列表,下一轮外层循环执行if is_prime[i]尝试对布尔值做下标取值,直接触发类型错误。
修复方案
只需要把内层循环的赋值逻辑修改为仅修改is_prime列表对应下标的值即可,你原本的筛法起始位置计算逻辑是正确的,不需要调整。
修复后的完整代码:
def generate_primes(n): if n < 2: return [] size = (n - 3) // 2 + 1 primes = [2] is_prime = [True] * size for i in range(size): if is_prime[i]: p = i * 2 + 3 primes.append(p) # 筛除当前素数p的倍数 for j in range(2 * i ** 2 + 6 * i + 3, size, p): is_prime[j] = False return primes print(generate_primes(100))
运行代码可正确输出100以内的所有素数。
内容的提问来源于stack exchange,提问作者Patrick_Chong
相关产品推荐
相关产品推荐

