分配前引用的错误局部变量

时间:2019-06-21 08:24:12

标签: python

我正在尝试创建一个函数,将列表中的每个数字四舍五入到该数字列表中的最接近的数字(-3,0,2,4,7,10,12)。当我尝试运行以下代码时,python给我以下错误消息:“ UnboundLocalError:分配前引用了本地变量'GR'”。谁能帮我解决这个问题?

def roundGrade(grades):
    grades = []

    for i in grades:
        if (grades >= 11) and (grades <= 12):
            gradesRounded == 12
        elif (grades >= 8.5) and (grades < 11):
            gradesRounded == 10
        elif (grades >= 5.5) and (grades < 8.5):
            gradesRounded == 7
        elif (grades >= 3) and (grades < 5.5):
            gradesRounded == 4
        elif (grades >= 1) and (grades < 3):
            gradesRounded == 2
        elif (grades >= -1.5) and (grades < 1):
            gradesRounded == 0
        elif (grades >= -3) and (grades < -1.5):
            gradesRounded = -3
        else:
            print("Grade out of range")

    return gradesRounded

print(roundGrade([8.2, -0.5, 10.4, 5.7]))

3 个答案:

答案 0 :(得分:0)

首先,您似乎并没有在比较各个成绩,而是在列表本身。

例如,您的其中一行应该看起来像

for i in grades:
    if (i >= 11) and (i <= 12):
        gradesRounded = 12
    elif (i >= 8.5) and (i < 11):
        gradesRounded = 10

您的主要问题是,您正在使用双等号向gradesRounded分配一个值,该值仅检查它们是否相等(返回true或false)。您只需要一个等号。我已经在上面的更改代码中对此进行了更改。

答案 1 :(得分:0)

def roundGrade(grades):
    grades = []

    for i in grades:
        ...
    return gradesRounded

问题是第grades = []行。它会创建一个新列表,该列表为空,因此,当您尝试迭代for i in grades:时,grades是一个空列表,它与传递给此函数的列表不同:roundGrade(grades): < / p>

答案 2 :(得分:0)

您的代码中有几个问题。首先,您的函数被传递了一个称为成绩的参数,在您的情况下,这是一个列表。然后,您立即用一个空列表覆盖此值。由于您现在有一个空列表,因此无需在循环中进行任何迭代,因此您的循环永远不会运行。然后,您尝试返回从未设置的gradesRounded。

此外,即使您确实设法迭代了循环,这里还是有几个问题。您正在将变量等级(列表)与整数进行比较。这是行不通的。您应该比较将在每个循环上更新的i,以指向下一个等级值。

此外,您还比较了等级,因为您使用了double equals ==,所以用整数进行了舍入。如果要分配给它,则需要使用单个等于。最重要的是,您每次都覆盖了gradesRounded的值。因此,如果您曾经尝试过将返回的等级四舍五入,那么它将仅包含一个整数,这是它四舍五入的最后一个等级。

在这里我必须做一些假设,即您想通过一个成绩列表并返回一个等效的四舍五入成绩列表。下面是完成此操作的代码的更新版本。

def round_grades(grades):
    rounded_grades = []
    for grade in grades:
        if 11 <= grade <= 12:
            rounded_grades.append(12)
        elif 8.5 <= grade < 11:
            rounded_grades.append(10)
        elif 5.5 <= grade < 8.5:
            rounded_grades.append(7)
        elif 3 <= grade < 5.5:
            rounded_grades.append(4)
        elif 1 <= grade < 3:
            rounded_grades.append(2)
        elif -1.5 <= grade < 1:
            rounded_grades.append(0)
        elif -3 <= grade < -1.5:
            rounded_grades.append(-3)
        else:
            print("Grade out of range")

    return rounded_grades

print(round_grades([8.2, -0.5, 10.4, 5.7]))

输入:[8.2, -0.5, 10.4, 5.7]

输出:[7, 0, 10, 7]