为什么我编写的简易素数校验器运行时报IndexError列表下标越界错误?
报错根因
你触发IndexError: list index out of range的直接原因是:首次执行print(primes[-1])时,primes是空列表,空列表不存在最后一位元素,直接取值就会抛出索引越界错误。
代码逻辑错误梳理
你的素数判断逻辑存在多处问题,才会走到空列表取值的报错场景:
- 素数判断规则完全错误:你当前的逻辑是只要存在任意一个
i不能整除number,就将number加入素数列表,这不符合素数定义。素数需要满足所有从2到自身开根号的整数都不能整除它,才可以判定为素数。 - 非素数标记逻辑无效:你定义的
not_primes变量没有起到标记作用,给i赋值为not_primes的操作不会对后续判断产生任何影响,也不会跳过后续的打印逻辑。 - 变量自增位置错误:你将
number += 1放在了for循环内部,每遍历一次i就修改一次number的取值,会导致for循环的遍历范围和当前待判断的数字完全不匹配,逻辑彻底混乱。 - 无判断就直接打印素数列表元素:你没有判断当前数字是否为素数、是否已经被加入到
primes列表,就直接调用primes[-1],遇到非素数场景primes没有新增元素,就会触发空列表取值错误。
修正后可运行代码
# 从最小的素数2开始判断 current_num = 2 primes = [] # 以获取前10个素数为终止条件,避免死循环 while len(primes) < 10: is_prime = True # 素数判断只需遍历到数字开根号即可,优化性能 for i in range(2, int(current_num ** 0.5) + 1): if current_num % i == 0: is_prime = False break if is_prime: primes.append(current_num) print(primes[-1]) current_num += 1
内容的提问来源于stack exchange,提问作者AlexLikesWater
相关产品推荐
相关产品推荐

