Python生成10项斐波那契数列遇冗余值及占位列表优化咨询
斐波那契数列冗余值问题分析与优化
冗余值产生原因
你代码里的核心问题是重复存储数据:
- 初始列表已经预先分配了10个位置(2个初始值+8个
None占位),循环中你先给这些None的位置赋值,生成了正确的斐波那契数; - 但同时又调用
list1.append(list1[i]),每次循环都把刚算出的值再添加到列表末尾,相当于把第3到第10项的数重复存了一遍,最终导致列表后半段出现冗余。
另外,你写的循环范围range(2,11)存在索引越界风险:初始列表只有10个元素(索引0-9),当i=10时执行list1[i]会直接报错,你的输出没报错说明实际运行的循环范围应该是range(2,10)(对应8次循环,正好填满初始列表的None,同时append8次,导致多8个冗余值)。
解决方法
只需要保留「赋值填充预分配列表」或「动态append新增元素」其中一种逻辑即可,二选一:
方式1:填充预分配列表(去掉append)
调整循环范围到合法索引区间,删掉多余的append语句:
list1 = [0, 1, None, None, None, None, None, None, None, None] for i in range(2, 10): list1[i] = list1[i-1] + list1[i-2] print(list1) # 输出:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
方式2:动态生成列表(去掉预分配)
不需要预先占位,直接从初始值开始动态添加元素,代码更简洁:
list1 = [0, 1] # 已有2个元素,需再生成8个凑够10项 for _ in range(8): next_num = list1[-1] + list1[-2] list1.append(next_num) print(list1)
更优的列表占位方式
你用None做占位符是可行的,但有更灵活高效的选择:
- 乘法批量生成:如果需要固定长度的占位列表,用乘法更简洁,比如生成包含2个初始值+8个
None的列表:list1 = [0, 1] + [None] * 8,避免手动重复写None; - 动态生成(推荐):像方式2那样,完全不需要预分配占位符,通过
append动态添加元素,既不会出现索引越界问题,代码也更易读; - 列表推导式:如果需要统一初始值的占位列表,比如用0填充:
list1 = [0 for _ in range(10)],再修改前两个值为0和1即可,适合需要统一初始值的场景。
内容的提问来源于stack exchange,提问作者Majoka
相关产品推荐
相关产品推荐

