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)
关键改动说明
- 重构
calc_points():使用列表推导式生成全新的积分列表,完全不触碰原始名次列表,避免了对原始数据的修改。 - 区分原始数据与计算数据:在
get_rider_info()中用original_places保存用户输入的原始名次,point_list仅用于计算总分,最终将原始名次和总分依次加入结果列表。 - 简化输入逻辑:
get_place()改用循环生成四次输入提示,减少重复代码,提升可读性。
测试输入Bob、1、2、3、4,输出结果为['Bob', 1, 2, 3, 4, 9],完全符合需求。
内容的提问来源于stack exchange,提问作者Soupkiller
相关产品推荐
相关产品推荐

