Flask中列表追加触发IndexError:索引越界问题求助
解决Flask中IndexError: list index out of range的问题
嘿,我一眼就看出你这个索引越界错误的核心原因了——你预先把mainpage_list固定成了只有两个空列表的结构,但循环却试图访问超出这个范围的索引。
具体问题分析
- 你一开始定义了
mainpage_list = [[],[]],这意味着它只有索引0和1两个子列表,最多只能存两组股票数据。 - 你的循环范围是
range(0, (lengh_dict - 1)):- 当数据库查询结果≤3行时,
lengh_dict-1最大是2,循环会执行i=0和i=1,刚好对应mainpage_list的两个子列表,所以不会报错,但这里还藏着另一个问题:range(0, lengh_dict-1)会漏掉最后一行数据!比如3行数据的话,索引2的那行根本没被处理。 - 当查询结果超过3行时,比如有4条数据,
lengh_dict-1=3,循环会执行i=0、1、2,但mainpage_list[2]根本不存在,直接触发IndexError。
- 当数据库查询结果≤3行时,
两种修复方案
方案一:动态添加子列表(更推荐,Pythonic写法)
直接遍历查询结果的每一行,为每行数据创建新的子列表,再追加到mainpage_list里,不管有多少条数据都不会越界:
current_stock_dict = db.execute("SELECT * FROM current_stocks WHERE c_user_id=:user_id ", user_id=session["user_id"]) # 改成空列表,后续动态添加子列表 mainpage_list = [] price_sum = 0 share_sum = 0 # 直接遍历查询结果的每一行,不用索引循环 for stock in current_stock_dict: stock_info = [] # 为当前股票创建一个新的子列表 c_symbol = stock["c_symbol"] lookup_symbol = lookup(c_symbol) stock_info.append(c_symbol) stock_info.append(lookup_symbol["name"]) c_count = stock["c_count"] stock_info.append(c_count) share_price = lookup_symbol["price"] stock_info.append("$" + str(share_price)) total_price = float(share_price) * int(c_count) stock_info.append("$" + str(total_price)) price_sum += total_price share_sum += c_count mainpage_list.append(stock_info) # 将当前股票信息加入主列表
方案二:预先初始化对应长度的列表
如果坚持要用索引循环,那先根据查询结果的长度初始化mainpage_list,同时修正循环范围避免漏掉数据:
current_stock_dict = db.execute("SELECT * FROM current_stocks WHERE c_user_id=:user_id ", user_id=session["user_id"]) lengh_dict = len(current_stock_dict) # 根据查询结果的长度,初始化对应数量的空列表 mainpage_list = [[] for _ in range(lengh_dict)] price_sum = 0 share_sum = 0 # 循环范围改成range(lengh_dict),遍历所有行 for i in range(lengh_dict): stock = current_stock_dict[i] c_symbol = stock["c_symbol"] lookup_symbol = lookup(c_symbol) mainpage_list[i].append(c_symbol) mainpage_list[i].append(lookup_symbol["name"]) c_count = stock["c_count"] mainpage_list[i].append(c_count) share_price = lookup_symbol["price"] mainpage_list[i].append("$" + str(share_price)) total_price = float(share_price) * int(c_count) mainpage_list[i].append("$" + str(total_price)) price_sum += total_price share_sum += c_count
额外提醒
原来的循环范围range(0, lengh_dict-1)是错误的,会漏掉最后一条数据,上面两种方案都修复了这个问题,确保所有股票数据都会被处理。
内容的提问来源于stack exchange,提问作者MRVN
相关产品推荐
相关产品推荐

