Момент создания локального пространства имен для функции
Локальное пространство имен — это область видимости переменных и функций, которая доступна только внутри определенной функции или блока кода. В JavaScript, когда функция выполняется, создается локальное пространство имен, в котором определяются все локальные переменные и функции, объявленные внутри нее.
Ключевые моменты:
- Локальное пространство имен создается при вызове функции. Когда функция вызывается, она создает свое собственное локальное пространство имен, где могут быть объявлены локальные переменные и функции.
- Локальные переменные, объявленные внутри функции, видимы только внутри этой функции. Они не доступны за пределами функции или в других функциях.
- Каждый вызов функции создает свое собственное локальное пространство имен. Если функция вызывается несколько раз, каждый вызов создает свою собственную копию локальных переменных и функций.
- Локальные переменные имеют приоритет перед глобальными переменными с тем же именем. Если внутри функции определена локальная переменная с таким же именем, как глобальная переменная, то при обращении к этой переменной будет использоваться локальная, а не глобальная переменная.
Использование локальных пространств имен помогает избегать конфликтов имен между переменными и функциями, а также улучшает модульность и переиспользуемость кода. Кроме того, локальные переменные имеют более короткое время жизни, поскольку они создаются только при вызове функции и уничтожаются при завершении функции.
Когда функция начинает выполнение
Когда функция вызывается в программе, происходит несколько ключевых моментов, приводящих к ее выполнению:
- Создание локального пространства имен для функции
- Привязка параметров и аргументов
- Выполнение кода функции
- Возвращение значения (при необходимости)
Создание локального пространства имен для функции
Перед выполнением кода функции, интерпретатор создает локальное пространство имен, где будут сохраняться все локальные переменные и другие объекты, созданные внутри функции. Это сделано для изоляции функции от глобального пространства имен, чтобы переменные с одинаковыми именами не конфликтовали между собой.
Привязка параметров и аргументов
Параметры функции — это имена, указанные в ее определении, которые она ожидает получить в качестве входных данных. Аргументы — это значения, переданные при вызове функции. При вызове функции, аргументы связываются с параметрами путем присваивания значений. Это позволяет использовать переданные значения внутри функции, и они становятся доступными по именам параметров.
Выполнение кода функции
После привязки параметров и аргументов, выполняется код функции. В этот момент интерпретатор последовательно выполняет инструкции, находящиеся внутри функции. Здесь можно использовать параметры, аргументы и другие переменные, объявленные внутри функции.
Возвращение значения
Возвращение значения — это опциональный шаг, который может происходить в конце выполнения функции. Если функция имеет оператор return, то она может вернуть значение обратно в вызывающую ее программу. Если оператор return не указан, функция вернет специальное значение None по умолчанию.
Все эти моменты вместе обеспечивают выполнение функции при вызове. Каждый раз, когда функция вызывается в программе, интерпретатор выполняет эти шаги, что позволяет использовать функции для структурирования кода и повторного использования логики.
Вопрос-ответ
Как работает локальное пространство имен в функции?
Локальное пространство имен в функции создается в момент вызова функции и уничтожается при завершении работы функции. Оно позволяет изолировать переменные и функции, объявленные внутри функции, от внешнего кода.
Когда именно создается локальное пространство имен для функции?
Локальное пространство имен для функции создается в момент вызова функции. Это происходит тогда, когда исполнение программы достигает строки, содержащей вызов функции.
Что происходит с локальным пространством имен после завершения работы функции?
После завершения работы функции локальное пространство имен уничтожается. Все переменные, объявленные внутри функции, исчезают, и к ним нельзя обратиться извне функции.
Могут ли переменные внутри функции иметь те же имена, что и переменные внешнего кода?
Да, переменные внутри функции могут иметь те же имена, что и переменные внешнего кода, но это не вызывает конфликта имен. Внутренние переменные имеют приоритет перед внешними и видны только внутри функции.
Каким образом локальное пространство имен для функции может быть полезным при написании кода?
Локальное пространство имен для функции полезно, когда нужно изолировать переменные и функции, чтобы они не конфликтовали с внешним кодом. Оно также позволяет упростить код и улучшить его читаемость, так как внутренние переменные не доступны извне функции.
Пространство имен и область видимости в классах
В определения классов происходят некоторые хитрые трюки с пространствами имен. Знание того, как работают пространства имен в объектах полезно для любого продвинутого программиста на Python.
Пространство имен — это отображение имен, определенных в объектах. Большинство пространств имен в настоящее время реализованы в виде словарей Python, но это обычно не заметно, кроме производительности, в будущем оно может измениться.
Примерами пространств имен являются:
- набор встроенных имен, содержащих такие функции, как abs() и имена встроенных исключений;
- глобальные переменные в модуле;
- локальные имена переменных в вызове функции.
В некотором смысле набор атрибутов объекта также образует пространство имен. Важно понимать о пространствах имен, то что между именами переменных в разных областях видимости нет абсолютно никакой связи. Например, два разных модуля могут определить функцию maximize без путаницы, пользователи модулей должны использовать точечную нотацию, для извлечения ее значения из модуля.
В языке Python используется слово атрибут для любого имени, следующего за точкой. Например, в выражении z.real , real — это атрибут объекта z . Строго говоря, ссылки на имена переменных, классов и функций в модулях — это ссылки на атрибуты. В выражении modname.funcname , modname — это объект модуля, а funcname — его атрибут. В этом случае происходит прямое сопоставление между атрибутами модуля и глобальными именами, определенными в модуле, они используют одно и то же пространство имен!
Атрибуты могут быть доступны для чтения или записи. В последнем случае возможно присвоение значений атрибутам. Для атрибутов модуля, доступных для записи можно написать modname.the_answer = 42 . Атрибуты, доступные для записи, также могут быть удалены с помощью оператора del . Например, del modname.the_answer удаляет атрибут the_answer из объекта с именем modname .
Пространства имен создаются в разные моменты времени и имеют разное время жизни. Пространство имен, содержащее встроенные имена (имена встроенных функций, имена встроенных исключений и т.д.), создается при запуске интерпретатора Python и никогда не удаляется. Глобальное пространство имен для модуля создается при чтении определения модуля, обычно пространства имен модулей также сохраняются до завершения работы интерпретатора. Операторы, выполняемые вызовом интерпретатора верхнего уровня, считываются из файла сценария или в интерактивном режиме, считаются частью модуля с именем __main__ , поэтому они имеют свое собственное глобальное пространство имен с префиксом __main__ в точечной нотации. Встроенные имена на самом деле, также живут в модуле, такое пространство имен называется builtins .
Локальное пространство имен для функции создается при вызове функции и удаляется, когда функция возвращает или создает исключение, которое не обрабатывается внутри функции. На самом деле, забвение было бы лучшим способом описать то, что происходит на самом деле. Рекурсивные вызовы имеют свое собственное локальное пространство имен.
Область видимости — это текстовая область программы Python, в которой пространство имен доступно непосредственно. “Непосредственно доступный » здесь означает, что безусловная ссылка на имя пытается найти имя в пространстве имен.
Области видимости определяются статически, но используются динамически. В любой момент во время выполнения существует по крайней мере три вложенные области, пространства имен которых доступны непосредственно:
- Самая внутренняя область, которая ищется первой, содержит локальные имена. Области видимости любых вложенных функций, поиск которых начинается с ближайшей охватывающей области, содержит нелокальные, но также и неглобальные имена.
- Следующая за последней область содержит глобальные имена текущего модуля.
- Самая внешняя область (последний поиск) — это пространство имен, содержащее встроенные имена.
Если имя перемененной объявлено глобальным global , то все ссылки и присвоения переходят непосредственно в среднюю область — [2], содержащую глобальные имена модуля. Для повторного связывания переменных, найденных вне внутренней области (вложенные функции), можно использовать нелокальный оператор nonlocal . Если переменные не являются локальными, то эти переменные доступны только для чтения. Попытка записи в такую переменную просто создаст новую локальную переменную в самой внутренней области, оставив внешнюю переменную с идентичным именем неизменной.
Обычно локальная область ссылается на локальные имена (текстуально) текущей функции. Вне функций локальная область ссылается на то же пространство имен, что и глобальная область — пространство имен модуля. Определения классов помещают в локальную область еще одно пространство имен.
Важно понимать, что области видимости определяются текстуально: глобальная область видимости функции, определенной в модуле, является пространством имен этого модуля, независимо от того, откуда и под каким псевдонимом вызывается функция. С другой стороны, фактический поиск имен выполняется динамически во время выполнения, однако определение языка эволюционирует в сторону статического разрешения имен во время “компиляции”, поэтому не полагайтесь на динамическое разрешение имен! На самом деле локальные переменные уже определены статически.
Особенность Python заключается в том, что если нет глобального global или нелокального nonlocal оператора — присвоения имен всегда идут в самую внутреннюю область. Присвоение не копируют данные, они просто привязывают имена к объектам. То же самое верно и для удалений. Оператор del x удаляет привязку x из пространства имен, на которое ссылается локальная область. Фактически все операции, вводящие новые имена, используют локальную область: в частности, операторы импорта и определения функций связывают имя модуля или функции в локальной области.
Глобальный оператор global может использоваться для указания определенным переменным, что они находятся в глобальной области видимости и должны быть восстановлены в этой области. Нелокальный оператор nonlocal указывает, что определенные переменные находятся в закрытой области видимости и должны быть восстановлены в этой области.
Пример:
Пример отчетливо показывает динамическую сущность языка Python, последовательность поиска имен переменных, а так же демонстрирует, как ссылаться на различные области видимости в пространстве имен.
def scope_test(): def do_local(): spam = "local spam" def do_nonlocal(): nonlocal spam spam = "nonlocal spam" def do_global(): global spam spam = "global spam" spam = "test spam" do_local() print("After local assignment:", spam) do_nonlocal() print("After nonlocal assignment:", spam) do_global() print("After global assignment:", spam) scope_test() print("In global scope:", spam)
Выходные данные примера кода:
# After local assignment: test spam # After nonlocal assignment: nonlocal spam # After global assignment: nonlocal spam # In global scope: global spam
Обратите внимание, что локальное присвоение spam = «local spam» во внутренней функции do_local() не изменило значение spam , присвоенное во внешней функции scope_test . Нелокальное nonlocal присвоение spam = «nonlocal spam» во внутренней функции do_nonlocal() изменило значение spam , а глобальное global присвоение spam = «global spam» во внутренней функции do_global() изменило значение spam на уровне модуля.
Обратите внимание, что перед выполнением функции scope_test() не было никакого присвоения значения для переменной spam . Использование оператора global во внутренней функции do_global() восстановил переменную spam в глобальной области видимости, прежде чем она вывелась на печать!
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Пространство имен и область видимости в классах
- Определение классов
- Объект класса и конструктор класса
- Создание экземпляра класса
- Метод экземпляра класса
- Что такое метод класса и зачем нужен
- Что такое статический метод в классах Python и зачем нужен
- Атрибуты класса и переменные экземпляра класса
- Кэширование методов экземпляра декоратором lru_cache
- Закрытые/приватные методы и переменные класса Python
- Наследование классов
- Множественное наследование классов
- Абстрактные классы
- Перегрузка методов в классе Python
- Что такое миксины и как их использовать
- Класс Python как структура данных, подобная языку C
- Создание пользовательских типов данных
- Специальные (магические) методы класса Python
- Базовая настройка классов Python магическими методами
- Настройка доступа к атрибутам класса Python
- Дескриптор класса для чайников
- Протокол дескриптора класса
- Практический пример дескриптора
- Использование метода .__new__() в классах Python
- Специальный атрибут __slots__ класса Python
- Специальный метод __init_subclass__ класса Python
- Определение метаклассов metaclass
- Эмуляция контейнерных типов в классах Python
- Другие специальные методы класса
- Как Python ищет специальные методы в классах
- Шаблон проектирования Фабрика и его реализация
Пространства имен. Области видимости#
Область видимости определяет где переменная доступна. Область видимость переменной зависит от того, где переменная создана.
Чаще всего, речь будет о двух областях видимости:
- глобальной — переменные, которые определены вне функции
- локальной — переменные, которые определены внутри функции
При использовании имен переменных в программе, Python каждый раз ищет, создает или изменяет эти имена в соответствующем пространстве имен. Пространство имен, которое доступно в каждый момент, зависит от области, в которой находится код.
Поиск переменных#
При поиске переменных, Python использует правило LEGB. Например, если внутри функции выполняется обращение к имени переменной, Python ищет переменную в таком порядке по областям видимости (до первого совпадения):
L (local) — в локальной (внутри функции) E (enclosing) — в локальной области объемлющих функций (это те функции, внутри которых находится наша функция) G (global) — в глобальной (в скрипте) B (built-in) — во встроенной (зарезервированные значения Python)

Локальные и глобальные переменные#
- переменные, которые определены внутри функции
- эти переменные становятся недоступными после выхода из функции
- переменные, которые определены вне функции
- эти переменные „глобальны“ только в пределах модуля, чтобы они были доступны в другом модуле, их надо импортировать


Пример локальной intf_config:
In [1]: def configure_intf(intf_name, ip, mask): . : intf_config = f'interface intf_name>\nip address ip> mask>' . : return intf_config . : In [2]: intf_config --------------------------------------------------------------------------- NameError Traceback (most recent call last) ipython-input-2-5983e972fb1c> in module> ----> 1 intf_config NameError: name 'intf_config' is not defined
Обратите внимание, что переменная intf_config недоступна за пределами функции. Для того чтобы получить результат функции, надо вызвать функцию и присвоить результат в переменную:
In [3]: result = configure_intf('F0/0', '10.1.1.1', '255.255.255.0') In [4]: result Out[4]: 'interface F0/0\nip address 10.1.1.1 255.255.255.0'
Пространство имен и область видимости в Python
Пространство имен — это область кода, в которой находится набор идентификаторов. Оно используется для хранения значений переменных и других объектов, которые связаны с определенными именами (идентификаторами).
Область видимости — это часть программы, из которой можно получить доступ к пространству имен напрямую без какого-либо префикса.
Типы пространств имен в Python
В Python есть три типа пространств имен:
Встроенное пространство имен создается при запуске интерпретатора Python и существует, пока интерпретатор работает. По этой причине встроенные функции, такие как id() , print() и др., всегда доступны из любой части программы.
Глобальное пространство имен создается в каждом модуле. Модули могут иметь разные функции и классы.
Локальное пространство имен создается при вызове функции, в которой определены имена.
Разные пространства имен изолированы. Следовательно, одно и то же имя, которое может существовать в разных модулях, не вызывает конфликта имен. Аналогично и в случае с классом. Следующая диаграмма иллюстрирует данную концепцию.
Область видимости в Python
Несмотря на то, что определены различные уникальные пространства имен, мы не можем получить доступ ко всем из них из каждой части программы. В игру вступает такое понятие, как область видимости.
Область видимости — это часть программы, из которой можно получить доступ к пространству имен напрямую без какого-либо префикса.
В любой момент существует как минимум три вложенные области видимости:
Область видимости функции с локальными именами.
Область видимости модуля с глобальными именами.
Встроенная область видимости со встроенными именами.
Когда внутри функции создается ссылка, имя ищется в локальном пространстве имен, затем в глобальном пространстве имен и, наконец, во встроенном пространстве имен.
Если функция находится внутри другой функции, новая область видимости помещается в локальную область видимости (функции).
Рассмотрим пример использования пространств имен в Python:
