Python unboundLocalError-变量是字典中的键

Python unboundLocalError-变量是字典中的键,python,python-2.7,Python,Python 2.7,一切都会找到的,但现在我发现了错误 if gchild == 'endorsements': ecert = var.student_info[child][gchild] l = list() for subj in ecert: if ecert[subj]['courseendorsementresult'] != 'NO': result = ecert[subj]['courseendorsementresult']

一切都会找到的,但现在我发现了错误

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
奇怪的是,到目前为止,我一直在引用“学生”这个词

我没有名为student的全局变量

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


任何帮助都将不胜感激。

我想
gchild==“背书”
gchild==“localidentifier”
是独占的-因此不会出现两个代码块都将运行的情况。如果gchild='localidentifier':块,则只在
中为
学生
赋值,因此,如果第一个
gchild
值是
“背书”
将不会填充
学生
,最终会出现未绑定的LocalError

我不知道您的代码的细节,但我猜您可能希望使用类似于first
if
块的值填充
student
var,如下所示:

  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
或者您可以使用
ecert
变量,该变量的值似乎与
student
的值相同:

student = var.student_info[child][gchild]

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

正如您在以下条件下定义的
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
因此,在你的第二句话
中,如果gchild=='背书':
你不定义
学生
。因为你的条件都是检查
gchild的值,如果一个发生了,另一个没有发生!所以你有两个选择

  • 在新语句中也定义学生
  • 若可能的话,在所有条件的顶部定义它
    是的,这就是原因,回头看。当迭代gchild时,“证书”和“其他成就”排在“localidentifier”之后,但背书排在前面,因此学生尚未创建。谢谢
    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
    
    if gchild == 'localidentifier':
          student = var.student_info[child][gchild]