Я обнаружил, что во многих ресурсах «видимость» и «пространства имен» используются взаимозаменяемо, что немного сбивает с толку, поскольку они означают разные вещи.
- Область действия определяет область кода, в которой доступно имя.
- Правило LEGB определяет способ поиска имен.
- Пространство имен - это место, где вы ищите имена.
Тогда я читаю:
- «имена привязываются к пространству имен в соответствии с тем, где они назначены ...» (что, я считаю, относится к области действия в лексической области видимости).
- msgstr "функции добавляют дополнительный слой пространства имен в ваши программы" [ ref. ] (они не добавляют дополнительную локальную область?)
- «все имена, назначенные в определении функции, помещаются в локальную область (пространство имен, связанное с вызовом функции)».
- «глобальная область действия, то есть пространство имен, в котором находятся переменные, созданные (назначенные) на верхнем уровне файла модуля».
* все цитаты взяты из изучения Python 5-е издание ch17
Являются ли пространства имен в Python способом реализации областей? Это одно и то же? Кто-нибудь может просветить меня?
Ответы:
Пространство имен - это словарь, сопоставляющий имена (как строки) со значениями. Когда вы делаете назначение, например
a = 1
, вы мутируете пространство имен. Когда вы делаете ссылку, напримерprint(a)
, Python просматривает список пространств имен, чтобы попытаться найти его с именем в качестве ключа.А область применения определяет , какие пространства имен будут рассмотрены в и в каком порядке. Область действия любой ссылки всегда начинается в локальном пространстве имен и перемещается наружу, пока не достигнет глобального пространства имен модуля, прежде чем перейти к
builtins
(пространству имен, которое ссылается на предопределенные функции и константы Python, такие какrange
иgetattr
), которое является концом строки ,Представьте, что у вас есть функция с именем
inner
, вложенная в глобальную функцию с именемouter
иinner
содержащая ссылку на имя. Python сначала смотрит вinner
пространство имен. Если имени там нет, Python просматриваетouter
пространство имен. Если это не удается, Python пробуетglobal
пространство имен модуля , затемbuiltin
пространство имен, в конечном итоге выбрасывая,NameError
если имя не найдено.Когда мы говорим, что
x
находится в пространстве имен функции, мы имеем в виду, что оно определено там, локально внутри функции. Когда мы говорим, чтоx
находится в области действия функции, мы имеем в виду, что онаx
находится либо в пространстве имен функции, либо в любом из внешних пространств имен, в которое вложено пространство имен функции.Всякий раз, когда вы определяете функцию, вы создаете новое пространство имен и новую область видимости. Пространство имен - это новый локальный хэш имен. Область действия - это подразумеваемая цепочка пространств имен, которая начинается в новом пространстве имен, затем проходит через любые внешние пространства имен (внешние области), вплоть до глобального пространства имен (глобальная область) и до встроенных функций.
Термины могут использоваться почти взаимозаменяемо, но это не потому, что они означают одно и то же; это потому, что они во многом совпадают в том, что они подразумевают.
источник
Существует отличная статья о пространствах имен Python здесь . Чтобы процитировать соответствующую часть, чтобы ответить на ваш вопрос об отношении между областями и пространствами имен:
Например, представьте простую программу прокатки штампов:
roll
имеет собственное пространство имен , но имена в пространстве имен модуля также находятся в области видимости .источник