Python中初始化的空列表为何非空?附索引越界报错排查
问题解答:列表未清空假象与索引越界的修复方案
让我一步步拆解你遇到的两个问题,帮你搞定这些bug:
一、先解决最棘手的「IndexError: list index out of range」
你这里完全搞反了列表的索引顺序!
- 你的
tableData是3个行列表(每个行有4个元素),所以items[j]才是第j行,items[j][i]是第j行第i列的元素 - 但你写的是
items[i][j]:外层循环i的范围是0-3(因为len(items[0])=4),而items总共只有3个行(索引0-2),当i=3时,items[3]根本不存在,直接触发索引越界。
简单说,把items[i][j]改成items[j][i]就能解决这个报错,但我们还要调整逻辑的位置。
二、为什么「初始化的空列表看起来不为空」?
其实counter_list确实是每次调用函数时都初始化为空了,但你的追加逻辑放错地方了:
你把counter_list.append(counter)放在了内层循环里,内层循环每跑一次(每一行)就追加一次长度值,而不是等整列的最长长度统计完再追加。所以才会出现列表不断变长的情况,看起来像是没被清空,但实际上是追加时机错误。
三、修复后的完整代码
def printTable(items): counter_list = [] # 先确定总共有多少列(所有行的长度一致的前提下) num_columns = len(items[0]) # 遍历每一列,统计该列的最长字符串 for col_idx in range(num_columns): max_length = 0 longest_str = "" # 遍历每一行,获取当前列的元素 for row_idx in range(len(items)): current_str = items[row_idx][col_idx] current_len = len(current_str) # 更新最长长度和对应字符串 if current_len > max_length: max_length = current_len longest_str = current_str # 整列统计完成后,再把最长长度加入列表 counter_list.append(max_length) print(f'the longest string is: {longest_str}; and its length is {max_length}') print(f'Counter list: {counter_list}') tableData = [ ['apples','oranges','cherries','banana'], ['Alice','Bob','Carol','David'], ['dogs','cats','moose','goose'] ] printTable(tableData)
四、修复后的输出
the longest string is: apples; and its length is 6 the longest string is: oranges; and its length is 7 the longest string is: cherries; and its length is 8 the longest string is: banana; and its length is 6 Counter list: [6, 7, 8, 6]
额外小建议
- 用
f-string格式化字符串比直接拼接更清晰,也不容易出错 - 给循环变量起有意义的名字(比如
col_idx、row_idx),比i、j可读性强太多 - 如果担心输入的行长度不一致,可以加个小检查:比如先确认所有行的长度相同,避免后续索引问题
内容的提问来源于stack exchange,提问作者user9867610
相关产品推荐
相关产品推荐

