2013-09-28 11 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 ключ, или quizzes или tests:

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 .: Возможно, вы смешали вкладки и пробелы? Убедитесь, что ваш отступ соответствует. Дополнительная строка (либо 'total = 0', либо' global total' не изменяет отступы других строк. –

+0

Не 'get_class_average' просто собирается называть себя? – beroe

Смежные вопросы