如何修复输出重复相同的错误

How can I fix a bug that output is repeated the same

我正在尝试创建学生成绩单。首先,我必须同时创建学生和课程列表。但是,我被困在这个问题上。这是我的代码:

from datetime import datetime

class StudentMark():
    class Student():
        def studentCount(student):
            student.count = int (input ("Enter number of students: "))
            return student.count

        def studentDetail(student):
            student.sID = input ("Student id: ")
            student.sName = input ("Student name: ")
            student.sDOB = input("Student's DOB:")
            student.setDOB=datetime.strptime(student.sDOB, "%d/%m/%Y")
            return student.sID, student.sName, student.setDOB
            
        def studentList(student):
            sList = []
            for i in range(student.count):
                sList.append ((student.sID, student.sName, student.setDOB))
                sList.sort()       
            for s in sList:
                print (f"Student id: {s[0]} Name: {s[1]} Date of birth: {s[2]}")      
            
    class Course():
        def courseCount(course):
            course.count = int (input ("Enter number of courses: "))
            return course.count

        def courseDetail(course):
            course.cID = input ("Course id: ")
            course.cName = input ("Course name: ")
            return course.cID, course.cName
            
        def courseList(course):
            cList = []
            for i in range(course.count):
                cList.append ((course.cID, course.cName))
                cList.sort()       
            for c in cList:
                print (f"Course id: {c[0]} Name: {c[1]}")                

    

    
    std = Student()
    std.studentCount()
    std.studentDetail()
    std.studentList()
    
    crs = Course()
    crs.courseCount()
    crs.courseDetail()
    crs.courseList()

当我想输入2个和2个以上的数据时。例如:

Enter number of students: 2
Student id: 111
Student name: max
Student's DOB:11/11/1111
Student id: 111 Name: max Date of birth: 1111-11-11 00:00:00
Student id: 111 Name: max Date of birth: 1111-11-11 00:00:00
Enter number of courses: 2
Course id: 1
Course name: math
Course id: 1 Name: math
Course id: 1 Name: math

如您所见,输出是重复的,我不知道如何解决这个问题。希望大家帮我解决一下。

方法 studentList() 中的第一个 for 循环循环了两次,因为范围 (student.count) 的计算结果为 2。请注意 student.count 在第一个 input('Enter number of students:'),即 2.

除了两次循环之外,在循环内添加到列表中的值不会改变,因为它们引用对象学生的同一实例的属性:

def studentList(student):
    sList = []
    for i in range(student.count):
        sList.append ((student.sID, student.sName, student.setDOB))
        sList.sort()       
    for s in sList:
        print (f"Student id: {s[0]} Name: {s[1]} Date of birth: {s[2]}")   

要达到收集多个Student并全部打印的效果,必须在收集完每个Student的数据后,立即将每个Student存储在一个数组中。像这样:

from datetime import datetime
import copy

class StudentMark():
    class Student():
        students = []

        def studentCount(student):
            student.count = int (input ("Enter number of students: "))
            return student.count

        def studentDetail(student):
            for s in range(student.count):
                print(f"### Student {s+1} entry ###")
                student.sID = input ("Student id: ")
                student.sName = input ("Student name: ")
                student.sDOB = input("Student's DOB: ")
                student.setDOB=datetime.strptime(student.sDOB, "%d/%m/%Y")
                student.students.append(copy.copy(student))
            
        def studentList(student):
            for s in student.students:
                print (f"Student id: {s.sID} Name: {s.sName} Date of birth: {s.sDOB}")

我已尽力修复代码。有更好的方法可以达到这个结果。