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

为何函数未修改输入列表?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:50:31