NameErrors и функции в python

Я постоянно получаю ошибку NameError Хотя я уже определил термин, проблема связана с «днем» в строке 28.

def today():
    day = input("What day is it?")

    if "sunday" in day:
        day = 0
    elif "monday" in day:
        day = 1
    elif "tuesday" in day:
        day = 2
    elif "wednesday" in day:
        day = 3
    elif "thursday" in day:
        day = 4
    elif "friday" in day:
        day = 5
    elif "saturday" in day:
        day = 6

    else:
        today()
today()

days_on_vacation = int(input("How many days will you be on vacation?   "))

days_to_add_to_day = days_on_vacation % 7

day += days_to_add_to_day

Я уже присвоил дню значение в функции today(), верно? Почему мне говорят, что он не определен?


person pokemonfan    schedule 04.04.2015    source источник


Ответы (1)


Имена, которые вы назначаете в функции, являются локальными; они не видны вне функции.

Лучший способ поделиться этим результатом — вернуть значение из функции, чтобы вы могли присвоить его переменной в результате вызова:

def today():
    # ...
    return day

а также

result = today()

Затем переменная result содержит значение, возвращенное функцией. Вы также можете использовать имя day, но тогда это отдельная переменная от той, что находится внутри функции.

Вы действительно усложнили ситуацию, используя рекурсивный вызов функции; затем вам также необходимо убедиться, что вы передаете результат рекурсивных вызовов обратно по цепочке:

def today():
    # ...
    else:
        return today()
    return day

Однако здесь лучше не полагаться на рекурсию; простой цикл enless подойдет лучше; возврат из функции автоматически завершит цикл:

def today():
    while True:
        day = input('...')
        # ...
        else:
            # not valid input, restart the loop
            continue

        # input was valid, return the result
        return day
person Martijn Pieters    schedule 04.04.2015
comment
Полное правило состоит в том, что имена, которые вы назначаете где угодно, являются локальными и не видны за пределами текущей локальной области, если иное не указано с помощью global или nonlocal. Это в равной степени верно и для тел классов, и для кода, обработанного методом exec(). Некоторая путаница возникает из-за того, что локальные переменные модуля также являются глобальными для модуля. - person Terry Jan Reedy; 04.04.2015