2013-09-28 113 views
1

我有28行錯誤說:CodeAcademy班級平均成績

UnboundLocalError: local variable 'total referenced before assignment. 

但是總金額超過28行引用上線24我不明白這是怎麼回事。我試圖寫的代碼是將每個學生的測試,測驗和作業分數的平均值。

感謝您的幫助。

lloyd = { 
    "name": "Lloyd", 
    "homework": [90.0, 97.0, 75.0, 92.0], 
    "quizzes": [88.0, 40.0, 94.0], 
    "tests": [75.0, 90.0] 
} 
alice = { 
    "name": "Alice", 
    "homework": [100.0, 92.0, 98.0, 100.0], 
    "quizzes": [82.0, 83.0, 91.0], 
    "tests": [89.0, 97.0] 
} 
tyler = { 
    "name": "Tyler", 
    "homework": [0.0, 87.0, 75.0, 22.0], 
    "quizzes": [0.0, 75.0, 78.0], 
    "tests": [100.0, 100.0] 
} 
def average(some): 
    return sum(some)/len(some) 

students = [lloyd, alice, tyler] 

total = 0 

def get_class_average(students): 
    for student in students: 
     total += get_class_average(students) 
    return float(total)/len(students) 

print get_class_average(students) 
+1

注意'UnboundLocalError'只是錯誤,你會之一得到。你還會得到一個'RuntimeError',因爲你在'get_class_average'中有一個永不結束的遞歸循環。 – iCodez

回答

4

您需要標記total作爲一個全球性的,如果你是分配給它的功能:

def get_class_average(students): 
    global total 
    for student in students: 
     total += get_class_average(students) 
    return float(total)/len(students) 

將其分配給定的變量,你將其標記爲本地名稱,除非你明確地將其標記爲全局。

您可能需要移動total的功能,而不是使之成爲一個全球性的:

def get_class_average(students): 
    total = 0 
    for student in students: 
     total += get_class_average(students) 
    return float(total)/len(students) 

您不會出現在你的代碼的其他地方使用它,所以使它成爲一個全球性是矯枉過正這裏。

你的下一個問題是你遞歸調用get_class_average();該函數調用本身,傳入完全相同的參數。該函數將永遠不會返回。我懷疑你的意思是調用average()函數,而不是在一個特定的列表通過爲每個學生,像homework鍵,或quizzestests

def get_class_average(students, key): 
    total = 0 
    for student in students: 
     total += average(student[key]) 
    return float(total)/len(students) 

homework_average = get_class_average(students, 'homework'] 
+0

當我這樣做時,我在第29行收到關於縮進的錯誤。 –

+1

@RobB .:你可能混合了製表符和空格嗎?確保你的縮進匹配。額外的行(總數= 0或全局總數不會改變其他行的縮進。 –

+0

是不是'get_class_average'只是繼續調用自己? – beroe