Можно ли объявлять функцию внутри другой функции и где она будет видна?

Объяснение вложенных функций и замыканий на явно выбранном примере Python: локальное имя, возврат функции наружу и доступ к переменным внешней области.

Короткий ответ

Что ответить на собеседовании

Язык в вопросе не указан. В Python вложенную функцию объявлять можно: ее имя по умолчанию локально для внешней функции. При этом сам объект функции можно вернуть или передать наружу. Вложенная функция может читать переменные внешней области, образуя замыкание; для перепривязки такой переменной используется nonlocal.

Подробный разбор

Ответ с пояснениями

Ответ зависит от языка, который в вопросе не указан. Рассмотрим Python как пример, не предполагая, что именно он использовался на исходном собеседовании. В Python функцию можно определить внутри другой функции. Когда выполнение доходит до внутреннего def, создается объект функции, а его имя связывается в локальной области внешней функции.

def outer():
    value = 7

    def inner():
        return value

    return inner

f = outer()
print(f())  # 7

Имя inner непосредственно снаружи outer недоступно, если отдельно не определено в другой подходящей области. Но объект функции можно вернуть, как в примере, сохранить под другим именем и вызывать после завершения outer. Значит, локальная видимость имени не означает запрет на использование самого объекта функции вне внешнего вызова.

В примере внутренняя функция обращается к value из окружающей области. Это замыкание: необходимая связь с внешней переменной сохраняется, пока она нужна функции. Не следует представлять это как обязательное копирование значения в момент объявления.

Для чтения переменной внешней функции nonlocal не требуется. Если нужно переприсвоить именно эту внешнюю переменную, используют nonlocal; обычное присваивание по умолчанию создает локальную переменную внутренней функции.

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

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку