Python列表切片/copy()赋值后被识别为整数,逐科目取最高分问题求解
科目最高分统计类型错误解决方案
错误原因
你遇到的a/b/c变量为int类型的问题,和copy()、切片复制方法本身无关,是变量赋值逻辑错误:
subject_score = [0, 0, 0, 0, 0]是长度为5的整数列表,subject_score[:]切片后返回的还是包含5个整数的列表- 直接用
a, b, c = subject_score[:]解包时,Python会将列表内的前三个整数0依次赋值给a、b、c,三个变量自然都是int类型,后续执行a[i]这类列表操作就会报错
修复方法
如果需要a、b、c为三个独立的、初始值和subject_score一致的列表,要分别进行三次拷贝:
subject_score = [0, 0, 0, 0, 0] a = subject_score.copy() b = subject_score.copy() c = subject_score.copy() # 也可以用切片写法:a = subject_score[:]
额外问题修复
你原有代码还有其他可修正的问题:
- 字符串和整数不能直接拼接,输出时需要将最高分转为字符串,比如
print("Math:"+ str(minscore1)) range(0, len(subject_score) - 1)会漏掉列表最后一个元素,应改为range(0, len(subject_score))- 不需要手动循环计算最大值,直接用Python内置的
max()函数即可简化代码
完整可运行代码(符合需求)
以下代码实现了从输入录入分数、统计每个科目最高分的完整功能:
subjects = ["数学", "英语", "科学"] score_count = 5 all_scores = [] # 录入分数 for sub in subjects: print(f"请输入{sub}的{score_count}个分数:") sub_scores = [] for _ in range(score_count): sub_scores.append(int(input())) all_scores.append(sub_scores) # 输出最高分 for idx, sub_name in enumerate(subjects): best_score = max(all_scores[idx]) print(f"{sub_name} Best Score: {best_score}")
如果你需要保留原有代码的逻辑,修复后的版本如下:
subject_score = [0, 0, 0, 0, 0] # 正确初始化三个列表 a = subject_score[:] b = subject_score[:] c = subject_score[:] # 示例分数数据,可替换为你自己的输入逻辑 midterm_score = [ [0,20,30,40,50], [0,40,50,80,90], [0,90,78,90,97] ] for i in range(len(subject_score)): a[i] = midterm_score[0][i] b[i] = midterm_score[1][i] c[i] = midterm_score[2][i] # 计算数学最高分 minscore1 = a[0] for i in range(1, len(subject_score)): if minscore1 < a[i]: minscore1 = a[i] # 计算英语最高分 minscore2 = b[0] for i in range(1, len(subject_score)): if minscore2 < b[i]: minscore2 = b[i] # 计算科学最高分 minscore3 = c[0] for i in range(1, len(subject_score)): if minscore3 < c[i]: minscore3 = c[i] print(a, b, c) print("Math:" + str(minscore1)) print("English:" + str(minscore2)) print("Science:" + str(minscore3))
内容的提问来源于stack exchange,提问作者J.Moon
相关产品推荐
相关产品推荐

