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)
关键修改说明
- 将
perfomance从类属性改为实例属性,在__init__中为每个学生实例初始化独立的字典,避免数据互相覆盖。 - 循环中保存实例化的
Grading对象,直接引用实例的perfomance字典,而非类属性。 - 修正了
avarage_mks的拼写错误,改为规范的average_marks(可选,但提升代码可读性)。
内容的提问来源于stack exchange,提问作者Eric Omondi
相关产品推荐
相关产品推荐

