【问题标题】:Missing items when I loop over a dictionary当我遍历字典时缺少项目
【发布时间】:2020-09-11 10:30:23
【问题描述】:

我尝试创建一个学生类对象,并收集一些数据并显示它:

class Student: 

    subjects = []
    grades = []  
    d = {}
    def __init__(self, name, id):
            self.name = name
            self.id = id 


    def addGrade(self, subject, grade):
        self.subjects.append(subject)
        self.grades.append(grade)


    def showGrades(self):
        self.d = dict(zip(self.subjects, self.grades))
        for subject in self.d:
            return subject + ' : ' + str(self.d[subject])

当我尝试添加值时:

    stu =Student('Zaki', 23)
    stu.addGrade('Math',90)
    stu.addGrade('Physicis',95)
    stu.addGrade('English',100)

    print(stu.showGrades())

输出变为 数学:90

它会忽略其他值!

【问题讨论】:

  • 请以与运行时相同的方式缩进代码。 (现在根据可能发生的情况进行了编辑。)
  • 顺便说一句,您应该将subjects = [] 移动到__init__() 中作为self.subjects = []。与grades 相同。 d = {} 也不做任何事情。
  • 在我的回答中,我讨论了@quamrana 提出的相同观点。虽然您只有一个实例,但您并没有意识到问题所在。一旦你创建了Student 的第二个实例,你就会发现使用subjectsgrades 的类变量时会出现问题。
  • 可变类变量(或者至少,实际上改变它们)通常是一个坏主意。将它们保存为所有实例都应该相同的常量。

标签: python list dictionary oop zip


【解决方案1】:

当您在 showGrades 中调用 return subject + ' : ' + str(self.d[subject]) 时退出函数,您不能在循环中使用 return。您应该根据自己的喜好解析和格式化输出,然后在循环外使用 return。

【讨论】:

    【解决方案2】:

    您遇到的具体问题是您将(无条件的)return 放入 for 循环中(因此它在循环的第一次迭代时返回),而不是例如构建一个列表和在循环之后返回该列表。

    然而,除此之外,你的代码也在修改类变量,如果你再创建一个实例stu2 = Student(...),发现第二个学生已经有了科目和成绩,你会感到惊讶。

    要解决第二个问题,您需要将subjectsgrades 改为实例变量 - 并在__init__ 中初始化它们。您可以对您的类变量 d 执行类似操作,但看起来它可能仅用于 showGrades 内部,并且可能最好在该方法(函数)中替换为局部变量。

    把这些放在一起,你可以有这样的东西:

    class Student: 
    
        def __init__(self, name, id):
                self.name = name
                self.id = id 
                self.subjects = []
                self.grades = []  
    
    
        def addGrade(self, subject, grade):
            self.subjects.append(subject)
            self.grades.append(grade)
    
    
        def showGrades(self):
            d = dict(zip(self.subjects, self.grades))
            grades = []
            for subject in d:
                grades.append(subject + ' : ' + str(d[subject]))
            return grades
    
    stu =Student('Zaki', 23)
    stu.addGrade('Math',90)
    stu.addGrade('Physics',95)
    stu.addGrade('English',100)
    print(stu.showGrades())  # ['Math : 90', 'Physics : 95', 'English : 100']
    
    stu2 = Student("Juan", 24)
    print(stu2.showGrades())  # []
    

    【讨论】:

      【解决方案3】:

      您希望showGrades 中的 return subject + ' : ' + str(self.d[subject]) 运行3 次,但是当它到达第一个返回时,它会离开循环。因此,将您的 showGrades 代码更改为:

      def showGrades(self):
          self.d = dict(zip(self.subjects, self.grades))
          ret = []
          for subject in self.d:
              ret.append(subject + ' : ' + str(self.d[subject]))
          return ret # this will return list containing [subject : grade]
      

      输出:

      ['Math : 90', 'Physicis : 95', 'English : 100']
      

      【讨论】:

        猜你喜欢
        • 2022-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        • 2019-09-24
        相关资源
        最近更新 更多