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

Python中如何保持初始列表不被修改?

问题解决:保留骑手原始比赛名次并计算总分

问题核心

当前代码中calc_points()函数直接修改了传入的原始名次列表(列表是可变对象,函数内的修改会同步影响外部列表),导致输出结果里的原始名次被替换成了积分,无法保留用户输入的原始数据。

解决方案

我们需要修改两个部分:让calc_points()生成新的积分列表而非修改原列表,同时在主逻辑中区分原始名次和积分列表,最终保留原始名次并计算总分。

修改后的完整代码

def calc_points(points):
    # 生成新的积分列表,不修改原始名次数据
    return [5 if p == 1 else 3 if p == 2 else 1 if p == 3 else 0 for p in points]
        
def get_place():
    place = []
    # 用循环简化重复输入逻辑
    for i in range(4):
        race_order = ["first", "second", "third", "fourth"][i]
        place.append(int(input(f"What place did you come in for your {race_order} race?\n> ")))
    return place

def get_rider_info():
    rider_info = []
    rider_info.append(input("What is the Rider's Name?\n> "))

    original_places = get_place()  # 存储原始名次
    point_list = calc_points(original_places)  # 转换为积分列表
    total_points = sum(point_list)

    rider_info.extend(original_places)  # 添加原始名次到结果
    rider_info.append(total_points)  # 添加计算出的总分

    return rider_info
        

rider1 = get_rider_info()
print(rider1)

关键改动说明

  1. 重构calc_points():使用列表推导式生成全新的积分列表,完全不触碰原始名次列表,避免了对原始数据的修改。
  2. 区分原始数据与计算数据:在get_rider_info()中用original_places保存用户输入的原始名次,point_list仅用于计算总分,最终将原始名次和总分依次加入结果列表。
  3. 简化输入逻辑:get_place()改用循环生成四次输入提示,减少重复代码,提升可读性。

测试输入Bob、1、2、3、4,输出结果为['Bob', 1, 2, 3, 4, 9],完全符合需求。

内容的提问来源于stack exchange,提问作者Soupkiller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:10:04