Игнорирование правил областей видимости – LEGB правила

Если вы не знаете правил области видимости Python, то есть большая вероятность того, вы сделаете ошибку. Это потому, что Python использует немного другой подход к областям видимости, чем другие языки программирования. Например, он позволяет доступ к переменным, объявленная внутри цикла или в блоках if заявления извне. Это может немного дезориентировать программистов с опытом C / C ++ .

Вот краткий обзор  правил областей видимости Python правил а.к.а. LEGB.
L – Local. Включает в себя имена (идентификатор / переменные), указанные в функции (с использованием def или lambda), а не объявляются с помощью ключевого слова global.
E – Enclosing. Включает в себя имя из локальной области видимости объемлющих функций  (например, с использованием def или lambda).
G – Global. Включает в себя имена, работающих на верхнем уровне модуля или определенных с помощью ключевого слова global.
B – Build-in . Встроенные встроенные функции, такие как print, input, open и т.д

Согласно LEGB о для поиска имен в Python определен следующий порядок:

Local -> Enclosing-> Global -> Built-in:

.

Таким образом, если имя -> объект не доступно в локальных пространствах имен, он будет затем ищется в enclosed. Если это не удастся, то Python будет дальше искать в глобальном пространстве имен, потом продолжит поиск в встроенных функциях. Если имя не удается найти ни в каком пространстве имен, генерируется ошибка NameError.

LEGB пример:

Чтобы понять правила LEGB, рассмотрим следующий пример. Он демонстрирует практическое использование и влияние правил области видимости Python. В этом примере использовано четыре функции:
1. Функция access_local (): Она использует локальную переменную с именем, как “маркер” (которая также существует в глобальном пространстве имен) и инициализирует ее с некоторым значением. Затем функция запрашивает локальные и глобальные пространства имен, чтобы подтвердить свое присутствие в них обоих. И, наконец, распечатывает переменную – “маркер”, чтобы убедиться, что она не ссылается на глобальную переменную.
2. Функция access_enclosed (): Она имеет вложенный цикл for и инициирует переменную-маркер внутри цикла. Затем функция проверяет глобальное пространство имен на наличие переменной-маркера . Затем печатает значение переменной, которое определяется внутри цикла for. Это демонстрирует, что переменные, определенные в цикле, имеют более высокий приоритет, чем глобальные переменные.
3. Функция access_global (): В этой функции мы сначала подтверждаем наличие переменной- маркера в глобальном пространстве имен. А потом печатаем ее значение, которое остается таким же, как и в самом начале, т.е. на глобальном уровне.
4. Функция id (): Здесь мы создали наше собственное определение встроенной функции “id ()”. А согласно правилам LEGB, встроенные модули имеют наименьший приоритет. Таким образом, всякий раз, когда мы называем функцию “id”, Python будет ссылаться имя, доступное в глобальном пространстве имен.
5. NameError – Как было сказано выше, использование не определенной переменной генерирует ошибку NameError. В приведенном ниже примере видно, что происходит с последней инструкцией. В этой строке мы попытались напечатать “token1”, что привело к ошибке.

Пример кода:

Результат выполнения:

Поделитесь с друзьями:

Оставьте комментарий