【问题标题】:Python: Updating Value for Nested Dictionary Inside a Class FunctionPython:更新类函数内嵌套字典的值
【发布时间】:2020-06-29 04:39:26
【问题描述】:

我正在尝试创建一个班级来创建学生成绩信息系统。

尝试在我的班级中创建“更新”功能时遇到问题。

这是我的班级的样子:

class StudentManagement(object):

    def __init__(self): 
        """ Initializes a dictionary to keep track of students' grades """
        self.student_dict = {}


    def add_student(self,num_students): 
        """ Add students to your student dictionary. All newly added students will have 0 for assignments."""

        for i in range(num_students):
            student_id = input("Type in student ID for student " + str(i+1) + ": ")
            self.student_dict[student_id] = 0
        print(self.student_dict)


    def add_initial_assignments(self, assignment_name): # list of assignment names
        """ Add assignments to student dictionary. All assignments will be set to 0"""

        self.assignment_dict = {}
        for assignment in assignment_name:
            self.assignment_dict[assignment] = 0
        for key in self.student_dict:
            self.student_dict[key] = self.assignment_dict
        print(self.student_dict)


    def add_new_assignment(self, new_assignment): # one new assignment only
        """ Add a new assignment to existing assignments in student dictionary"""

        for key in self.student_dict:
            self.student_dict[key][new_assignment] = 0
        print(self.student_dict)


    def update(self, student_id, assignment_name, value):
        """Updates the assignment score for a given student id"""

        for key in self.student_dict:
            if key == student_id:
                self.student_dict[student_id][assignment_name] = value
        print(self.student_dict)

new = StudentManagement()
print("ADDED 3 students")
new.add_student(3)
print("\n")
print("ADDED Initial assignments")
new.add_initial_assignments(['Exam 1','Exam 2'])
print("\n")
print("ADDED new Quiz assignment")
new.add_new_assignment('Quiz 1')
print("\n")
print("UPDATED score for student Student_1")
new.update(student_id = 'Student_1',assignment_name = 'Quiz 1',value = 100)

当我使用最后一行代码更新学生的作业成绩时,该学生的测验 1 的所有成绩都变为 100,而不仅仅是 Student_1。我不确定我是否正确理解了 self.student_dict。我不想每次更新学生信息时都创建一个全新的字典。我该怎么办?

【问题讨论】:

    标签: python class dictionary nested


    【解决方案1】:

    一个学生的字典一改,所有学生的字典都变了,是因为它们都被分配到内存中的同一个字典中。这是因为在 add_initial_assignments 函数中,您使用了代码:

    key in self.student_dict:
                self.student_dict[key] = self.assignment_dict
    

    此代码不会为每个学生创建一个新字典,而是将它们都连接到同一个字典。您所要做的就是在它的末尾添加.copy(),如下所示:

    for key in self.student_dict:
                self.student_dict[key] = self.assignment_dict.copy()
    

    这样,它会为每个字典创建一个单独的字典,现在代码应该可以工作了。如果您不明白为什么他们都连接到同一个字典,那是因为您将所有学生都设置为一个相同的变量,即字典,该变量也是可变的。考虑这段代码:

    list1 = [1, 2, 3, 4]
    list2 = list1
    list1.pop()
    print(list1, list2)
    
    Output:
    [1, 2, 3] [1, 2, 3]
    

    您基本上在做与上面相同的事情,.copy() 解决了这个问题,因为它实际上为每个学生创建了一个单独的、独立的字典。

    【讨论】:

    • 谢谢!这对我来说很有意义:)
    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2012-09-16
    • 2015-09-08
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多