unboundLocalError - 变量是字典中的键

时间:2014-12-11 09:19:14

标签: python python-2.7

def create_school(school,year):
    all_students = {}
    achievements= {}
    var = data.Files.get(school,year)
    for child in var.student_info_parsed:
        for gchild in var.student_info_parsed[child]:
            for ggchild in var.student_info_parsed[child][gchild]:
                all_students[ggchild[0]] = ggchild
    for child in var.student_info:
        for gchild in var.student_info[child]:
            if gchild == 'localidentifier':
                student = var.student_info[child][gchild]
                achievements[student] = {}
                achievements[student]['certificates'] = []
                achievements[student]['otherachievements'] = []
            if gchild == 'certificates':
                for ggchild in var.student_info[child][gchild]:
                    cert = var.student_info[child][gchild][ggchild]
                    cert_year = cert[2][0:4]
                    if cert_year == year:
                        achievements[student]['certificates'].append(cert)
            if gchild == 'otherachievements':
                ocert = var.student_info[child][gchild]
                n = 0
                while n < len(ocert):
                    ocert_year = ocert[n][1]
                    if ocert_year == year:
                        achievements[student]['otherachievements'].append(ocert[n])
                    n = n+1
            if gchild == 'endorsements':
                ecert = var.student_info[child][gchild]
                l = list()
                for subj in ecert:
                    if ecert[subj]['courseendorsementresult'] != 'NO':
                        result = ecert[subj]['courseendorsementresult']
                        l.append([subj,result]) 
                achievements[student]['endorsements'] = l
    return achievements

所以在我添加条件之前

if gchild == 'endorsements':
    ecert = var.student_info[child][gchild]
    l = list()
    for subj in ecert:
        if ecert[subj]['courseendorsementresult'] != 'NO':
        result = ecert[subj]['courseendorsementresult']
            l.append([subj,result]) 
    achievements[student]['endorsements'] = l

一切都在寻找,但现在我收到了错误

  File "/Users/Teacher/Documents/Python/Standards/Data_Manipulation_3/data_man.py", line 454, in create_school
    achievements[student]['endorsements'] = l
UnboundLocalError: local variable 'student' referenced before assignment
对我来说很奇怪的是,到目前为止我一直在提及“学生”。

我没有名为student的全局变量?

我真的很困惑我认为当全局变量和局部变量之间存在混淆时会发生这些错误,但“学生”变量只是本地变量?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我认为gchild == 'endorsements'gchild == 'localidentifier'是独占的 - 所以当两个代码块都运行时,不会出现这种情况。您仅在student块中为if gchild == 'localidentifier':分配值,因此,如果第一个gchild值为'endorsements',则student将不会被填充,你最终得到UnboundLocalError。

我不知道您的代码的具体细节,但我想您可能希望使用类似于第一个student块的if var填充,如下所示:

student = var.student_info[child][gchild]

或者您可以使用ecert变量,它似乎与student具有相同的值:

if gchild == 'endorsements':
  ecert = var.student_info[child][gchild]
  l = list()
  for subj in ecert:
    if ecert[subj]['courseendorsementresult'] != 'NO':
    result = ecert[subj]['courseendorsementresult']
        l.append([subj,result]) 
  achievements[ecert]['endorsements'] = l

答案 1 :(得分:1)

您的变量student是在前面加if gchild == 'localidentifier'的块中创建的。如果执行该块,变量student将可用。但是,如果前面带有if gchild == 'endorsements'的块在之前执行另一个块(因为gchild=='endorsements'之前的迭代比gchild=='localidentifier'),那么变量{{1将不会被创建。

答案 2 :(得分:0)

正如您在以下条件中定义student

if gchild == 'localidentifier':
      student = var.student_info[child][gchild]

所以在你的第二个陈述if gchild == 'endorsements':下你没有定义student。因为你的条件都会检查gchild的价值,如果有其他事件发生的话,那就不行了!所以你有两个选择

  1. 也在新陈述中定义学生。
  2. 如果可能的话,在所有条件的顶部定义它。