В чем разница локальных и глобальных переменных в Python
Что проверяют
Знаете ли вы, как Python ищет имя, а не только определения из учебника. Почти всегда следом дают код, который падает с UnboundLocalError, просят объяснить почему, а потом спрашивают про nonlocal.
Как отвечать
Начните с правила LEGB: имя ищется по очереди в локальной области функции (Local), в объемлющих функциях (Enclosing), в глобальной области модуля (Global) и во встроенных именах (Built-in). Дальше ключевые моменты:
- локальная переменная: любое имя, которому внутри функции что-то присваивается. Решение принимает компилятор по всему телу функции, поэтому присваивание в последней строке делает имя локальным и в первой;
- глобальная переменная: имя верхнего уровня модуля. Глобальная она для модуля, а не для всей программы: из другого модуля её видно только через импорт;
global: нужен, только чтобы переприсвоить глобальное имя. Изменить глобальный список черезitems.append(x)можно и без него, имя ведь не переприсваивается;nonlocal: то же самое для переменной объемлющей функции, на нём держатся замыкания со счётчиками;- блоков нет:
if,for,withотдельной области не создают, переменная цикла доступна после цикла. Своя область есть у функций, классов, модулей и comprehension-выражений.
Добавьте практику: локальные переменные читаются быстрее, LOAD_FAST берёт значение из массива кадра, а LOAD_GLOBAL ищет по словарям модуля и встроенных имён. Изменяемое глобальное состояние мешает тестам и потокобезопасности, поэтому настройки передают параметром или держат в объекте, а константы модуля пишут в UPPER_CASE и не меняют.
Где спотыкаются
Не могут объяснить UnboundLocalError: в функции пишут count += 1 для глобального счётчика, Python считает count локальной во всём теле функции, а локального значения ещё нет.
Говорят, что локальные переменные всегда исчезают после выхода из функции. Если на них ссылается замыкание, объект живёт вместе с замыканием: удалением управляет счётчик ссылок, а не конец функции.
Переносят привычки из Java или C и ожидают, что переменная, созданная внутри if, снаружи недоступна.