You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python TypeError报错排查:FizzBuzz程序空列表初始化异常

FizzBuzz程序异常原因解析

需求

  • 当数字能被3整除时,打印"Fizz"而非数字;
  • 当数字能被5整除时,打印"Buzz"而非数字;
  • 当数字同时能被3和5整除(如15)时,打印"FizzBuzz"而非数字。

编写的代码

lista = []
for numero in range(1,101):
    lista.append(numero)

for numero2 in lista:
    if numero2 % 3 == 0 and numero2 % 5 ==0:
        lista[numero2] = "FizzBuzz"
    elif numero2 % 3 ==0:
        lista[numero2] = "Fizz"
    elif numero2 % 5 == 0:
        lista[numero2] = "Buzz"

for final in lista:
    print(final)

问题

初始化lista = []时会报错TypeError: Not all arguments converted during string formatting;但初始化lista = [0]时程序可以正常运行,这是为什么?


原因说明

核心问题是列表索引越界,但报错信息看起来像是字符串格式化问题,这是Python旧版本的特殊错误提示逻辑导致的误导。

  1. 当lista = []时,循环range(1,101)会向列表添加1到100,此时列表长度为100,合法索引范围是0~99。但第二个循环里你用numero2(即1~100的数字)作为索引修改列表:

    • 比如numero2=100时,lista[100]超出了列表的最大索引99,Python本应抛出IndexError,但旧版本中会把这个错误错误解析成字符串格式化错误(因为%既是取模运算符也是字符串格式化符号),所以显示TypeError。
  2. 当lista = [0]时,添加1到100后列表长度变为101,合法索引范围是0~100。此时numero2的最大值100刚好对应列表的最后一个索引,不会触发索引越界,因此程序能正常执行。

优化方案

没必要先存列表再修改,直接循环判断打印更简洁:

for numero in range(1, 101):
    if numero % 3 == 0 and numero % 5 == 0:
        print("FizzBuzz")
    elif numero % 3 == 0:
        print("Fizz")
    elif numero % 5 == 0:
        print("Buzz")
    else:
        print(numero)

如果一定要用列表存储结果,应该通过索引遍历,而非遍历列表元素:

lista = list(range(1, 101))
for i in range(len(lista)):
    numero = lista[i]
    if numero % 3 == 0 and numero % 5 == 0:
        lista[i] = "FizzBuzz"
    elif numero % 3 == 0:
        lista[i] = "Fizz"
    elif numero % 5 == 0:
        lista[i] = "Buzz"

for final in lista:
    print(final)

内容的提问来源于stack exchange,提问作者karla aguirre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:31:19