为何函数未修改输入列表?Python列表处理作业求助
函数无法修改输入列表matches的原因及解决方法
问题背景
作业约束:不可导入模块、使用切片操作、字符串方法或列表推导式。需求如下:
- 接收输入列表
matches,每3个元素生成子列表 - 移除第三个元素(整数)小于80的子列表
- 向结果中数值最大的子列表添加♥字符
输入示例:
matches = ["JS", "M", 90, "MS", "F", 76, "JB", "M", 89, "TM", "F", 79, "GM", "M", 100, "AB", "F", 65, "SK", "F", 88]
预期输出:
matches = [['JS', 'M', 90], ['JB', 'M', 89], ['GM', 'M', 100, '♥'], ['SK', 'F', 88]]
但运行以下代码后,输入列表matches未被修改,仍为原列表:
def findRecommendations(matches): matches_sublist = [] matches_final = [] for i in range(0, len(matches)): if i % 3 != 0: matches_sublist.append(matches[i]) elif i != 0: matches_final.append(matches_sublist) matches_sublist = [] matches_sublist.append(matches[i]) else: matches_sublist.append(matches[i]) matches_final.append(matches_sublist) matches_80_plus = [] for i in range(len(matches_final)): if matches_final[i][2] >= 80: matches_80_plus.append(matches_final[i]) final_max = 0 for i in range(len(matches_80_plus)): max = matches_80_plus[0][2] if matches_80_plus[i][2] > max: max = matches_80_plus[i][2] final_max = i if len(matches_80_plus) > 0: matches_80_plus[final_max].append("\u2665") matches = [] for i in range(len(matches_80_plus)): matches.append(matches_80_plus[i]) elif len(matches_80_plus) == 0: matches = []
原因分析
- 局部变量重新赋值切断关联:Python中函数参数
matches是局部变量,执行matches = []时,只是让这个局部变量指向新的空列表,和外部传入的原列表对象彻底断开关联,不会修改原列表。 - 未执行原地修改操作:原代码最后仅给局部
matches变量赋值,没有对传入的原列表进行清空、添加等原地修改操作。 - 最大值查找逻辑错误:遍历找最大值时,每次循环都将
max重置为matches_80_plus[0][2],无法正确跟踪当前最大值,可能导致找不到真正的最大值索引。
解决方法
要修改原列表,需对传入的列表进行原地清空+添加元素操作,同时修正最大值查找逻辑:
def findRecommendations(matches): matches_sublist = [] matches_final = [] # 生成每3个元素的子列表 for i in range(len(matches)): matches_sublist.append(matches[i]) # 每累计3个元素,添加到结果列表并清空临时列表 if (i + 1) % 3 == 0: matches_final.append(matches_sublist) matches_sublist = [] # 筛选第三个元素>=80的子列表 matches_80_plus = [] for i in range(len(matches_final)): if matches_final[i][2] >= 80: matches_80_plus.append(matches_final[i]) # 找到数值最大的子列表索引 final_max = 0 if len(matches_80_plus) > 0: current_max = matches_80_plus[0][2] for i in range(1, len(matches_80_plus)): if matches_80_plus[i][2] > current_max: current_max = matches_80_plus[i][2] final_max = i # 给最大值子列表添加♥ matches_80_plus[final_max].append("\u2665") # 原地修改原列表:先清空,再添加结果元素 matches.clear() for sublist in matches_80_plus: matches.append(sublist)
关键修改点说明
- 子列表生成逻辑优化:改为判断
(i+1)%3==0,每添加3个元素就存入结果,逻辑更清晰,避免原代码复杂的索引分支判断。 - 最大值查找修正:将
current_max初始化放在循环外,仅在遇到更大值时更新,确保正确找到最大值索引。 - 原地修改原列表:使用
matches.clear()清空原列表,再通过append逐个加入结果子列表,操作的是原列表对象,外部传入的列表会被修改。
内容的提问来源于stack exchange,提问作者Miller25
相关产品推荐
相关产品推荐

