Python:更新类函数中嵌套字典的值
我试图创建一个类来创建一个学生成绩信息系统 我在尝试在类中创建“update”函数时遇到问题 下面是我的班级的样子: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 =
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()
修复了问题,因为它实际上为每个学生创建了一个独立的词典。谢谢!这对我来说很有意义:)谢谢!这对我来说很有意义:)