Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:更新类函数中嵌套字典的值_Python_Class_Dictionary_Nested - Fatal编程技术网

Python:更新类函数中嵌套字典的值

Python:更新类函数中嵌套字典的值,python,class,dictionary,nested,Python,Class,Dictionary,Nested,我试图创建一个类来创建一个学生成绩信息系统 我在尝试在类中创建“update”函数时遇到问题 下面是我的班级的样子: class StudentManagement(object): def __init__(self): """ Initializes a dictionary to keep track of students' grades """ self.student_dict =

我试图创建一个类来创建一个学生成绩信息系统

我在尝试在类中创建“update”函数时遇到问题

下面是我的班级的样子:

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,而不仅仅是学生1。我不确定我是否正确理解了学生的自述。我不想每次更新学生信息时都创建一本全新的词典。我该怎么做呢?

为什么一个学生的字典一次更改就会更改所有学生的字典,因为它们在内存中都被分配到同一个字典。这是因为在add_initial_assignments函数中,您使用以下代码:

输入self.student\u指令:
self.student_dict[键]=self.assignment_dict
此代码不会为每个学生创建一个新词典,而是将他们都连接到同一个词典。您只需在末尾添加
.copy()
,如下所示:

用于输入self.student命令:
self.student_dict[key]=self.assignment_dict.copy()
这样,它会为每个字典创建一个单独的字典,现在代码应该可以工作了。如果您不理解为什么它们都连接到同一个字典,那是因为您将所有学生设置为一个相同的变量,即字典,该变量也是可变的。考虑这个代码:

list1=[1,2,3,4]
list2=list1
列表1.pop()
打印(列表1、列表2)
输出:
[1, 2, 3] [1, 2, 3]

您所做的基本上与上面所示的相同,并且
.copy()
修复了问题,因为它实际上创建了一个单独的,每个学生的独立词典。

一个学生词典的一次更改会更改所有学生词典的原因是,它们在内存中都被分配到同一个词典。这是因为在add_initial_assignments函数中,您使用以下代码:

输入self.student\u指令:
self.student_dict[键]=self.assignment_dict
此代码不会为每个学生创建一个新词典,而是将他们都连接到同一个词典。您只需在末尾添加
.copy()
,如下所示:

用于输入self.student命令:
self.student_dict[key]=self.assignment_dict.copy()
这样,它会为每个字典创建一个单独的字典,现在代码应该可以工作了。如果您不理解为什么它们都连接到同一个字典,那是因为您将所有学生设置为一个相同的变量,即字典,该变量也是可变的。考虑这个代码:

list1=[1,2,3,4]
list2=list1
列表1.pop()
打印(列表1、列表2)
输出:
[1, 2, 3] [1, 2, 3]

基本上,您正在执行与上面所示相同的操作,
.copy()
修复了问题,因为它实际上为每个学生创建了一个独立的词典。

谢谢!这对我来说很有意义:)谢谢!这对我来说很有意义:)