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

Python循环调用类方法仅生效最后一组传入值问题排查

问题分析与修复方案

核心问题

  • 类属性共享导致数据覆盖:Grading类中定义的perfomance是类级别属性,所有实例共用同一个字典对象。每次调用insert_results都会修改这个全局字典,最终所有结果条目都会指向最后一次修改的内容。
  • 错误引用类而非实例:循环中s = Grading是直接引用类本身,而非实例化后的对象,因此每次添加到perfomance_out的都是同一个类属性字典的引用。

修复后的完整代码

class Grading():
    # 移除类级别的perfomance属性
    def __init__(self,name,math,eng ,kis ,sci ,sos ):
        self.name = name
        self.math = math
        self.eng = eng
        self.kis = kis
        self.sci = sci
        self.sos = sos
        # 初始化实例专属的perfomance字典
        self.perfomance = {}
        self.find_total_marks()
        self.find_avg_marks()
        self.find_grade()
        self.insert_results()
        

    def find_total_marks(self):
        self.total = self.math + self.eng + self.kis + self.sci + self.sos
        
        
       
    def find_avg_marks(self):
        self.avg_marks = self.total / 5
        
        
       
    def find_grade(self):
        if self.avg_marks > 79:
            self.grade = "A"
        elif self.avg_marks >= 60 and self.avg_marks <= 79:
            self.grade = "B"
        elif self.avg_marks > 49 and self.avg_marks <= 59:
            self.grade = "C"
        elif self.avg_marks >= 40 and self.avg_marks <= 49:
            self.grade = "D"
        else:
            self.grade = "E"
       

    def insert_results(self):
        self.perfomance["name"] = self.name
        self.perfomance["total"] = self.total
        # 修正拼写错误:avarage_mks → average_marks
        self.perfomance["average_marks"] = self.avg_marks
        self.perfomance["grade"] = self.grade

results = []
perfomance_out = []

for i in range(1,int(input("Enter no of students: "))+ 1):
    
    inputs = [input("Enter name \n"),
        int(input("Mathematics: ")),
        int(input("English: ")),
        int(input("Kiswahili: ")),
        int(input("Science: ")),
        int(input("Social Studies: "))]
    results.append(inputs)
    # 保存实例化后的学生对象
    student = Grading(*inputs) 
    # 添加当前实例的perfomance字典到结果列表
    perfomance_out.append(student.perfomance)

print(results)
print(perfomance_out) 

关键修改说明

  1. 将perfomance从类属性改为实例属性,在__init__中为每个学生实例初始化独立的字典,避免数据互相覆盖。
  2. 循环中保存实例化的Grading对象,直接引用实例的perfomance字典,而非类属性。
  3. 修正了avarage_mks的拼写错误,改为规范的average_marks(可选,但提升代码可读性)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:20:11