仅在Python程序中保存最后一个对象的对象列表

时间:2018-12-18 04:55:03

标签: python class

因此,我有一个本来很简单的作业,希望我输入学科的成绩等。输入量随用户要输入的学科数而变化。输入工作正常,但是当我打印出保存的值时,只会保存最近输入的值。这是我的输入代码:

def gpa_input(classList):
    print("please enter how many classes you have")
    while True:
        try:
            numOfClasses = int(input())
        except ValueError:
            print("please enter a valid number")
            continue
        else:
            break
    for i in range (numOfClasses):
        classList.append(subject)
        print("enter name of " + str(i+1) + "th subject:")
        classList[i].name = input()
        print("enter num of credits for " + str(i+1) + "th subject:")
        while True:
            try:
                classList[i].credits = int(input())
            except ValueError:
                print("please enter a valid number")
                continue
            else:
                break
        print("enter grade for " + str(i+1) + "th subject:")
        while True:
            try:
                classList[i].gradePercentage = int(input())
            except ValueError:
                print("please enter a valid number")
                continue
            else:
                break

subject是一个包含字符串值和2个int值的类,其定义如下:

class subject:
    def __init__(name, credits, gradePercentage):
        self.name = name
        self.credits = credits
        self.gradePercentage = gradePercentage

下面是打印出所有代码的代码:

def main():
  gpa_input(classList)
  for i in range (len(classList)):
      print(classList[i].name)
      print(classList[i].credits)
      print(classList[i].gradePercentage)

我的代码有什么问题?我是通过错误的方式进行迭代,还是没有正确分配/保存某些内容?

1 个答案:

答案 0 :(得分:1)

您已经进入了非常常见的“陷阱”。 问题在于如何初始化subject类。

这里您只是将一个类添加到列表中: classList.append(subject)

这里的情况如下:
不带花括号调用subject后,您将拥有一个新对象。
但是,当您第二次调用它时-python不会为您初始化新对象,而只是返回在第一步中创建的对象。
因此,您需要做的是正确初始化所有subject对象。

两种方式:
1)从subject定义中删除参数,并将默认值设置为none +在classList.append(subject)中添加括号
2)将for循环中的所有值收集到变量中,并在函数末尾使用适当的args初始化subject类。