Em muitos recursos, achei "escopo" e "namespaces" usados de forma intercambiável, o que parece um pouco confuso, pois significa coisas diferentes.
- Escopo define a região do código em que um nome está disponível.
- A regra LEGB define a maneira como os nomes são pesquisados.
- Namespace é um local onde você procura nomes.
Então eu li:
- "os nomes são vinculados a um espaço de nome de acordo com o local onde estão atribuídos ..." (que eu acredito que é o acordo com os escopos no escopo lexical).
- "funções adicionam uma camada extra de namespace aos seus programas" [ ref. ] (eles não adicionam um escopo local extra?)
- "todos os nomes atribuídos dentro de uma definição de função são colocados no escopo local (o espaço para nome associado à chamada de função)."
- "escopo global - ou seja, um espaço para nome no qual vivem as variáveis criadas (atribuídas) no nível superior do arquivo do módulo."
* todas as citações são do aprendizado de python 5a edição ch17
Os namespaces no Python são da maneira que os escopos são implementados? Eles são a mesma coisa? Alguém pode me esclarecer?
Respostas:
Um espaço para nome é um dicionário, mapeando nomes (como cadeias) para valores. Quando você faz uma tarefa
a = 1
, você está mudando um espaço para nome. Quando você faz uma referência, por exemploprint(a)
, o Python examina uma lista de espaços para nome para tentar encontrar um com o nome como chave.Um escopo define em quais namespaces serão procurados e em que ordem. O escopo de qualquer referência sempre começa no namespace local e se move para fora até atingir o namespace global do módulo, antes de passar para o
builtins
(o namespace que faz referência às funções e constantes predefinidas do Python, comorange
egetattr
), que é o fim da linha .Imagine que você tenha uma função nomeada
inner
, aninhada em uma função global denominadaouter
einner
contenha uma referência a um nome. O Python procura pela primeira vez noinner
espaço para nome. Se o nome não estiver lá, o Python procurará noouter
espaço para nome. Se isso falhar, o Python tenta oglobal
espaço para nome do módulo e , em seguida, obuiltin
espaço para nome, eventualmente lançando umNameError
se o nome não for encontrado.Quando dizemos que
x
está no espaço de nomes de uma função, queremos dizer que ela é definida lá, localmente dentro da função. Quando dizemos quex
está no escopo da função, queremos dizer quex
está no namespace da função ou em qualquer um dos namespaces externos em que o namespace da função está aninhado.Sempre que você define uma função, cria um novo espaço para nome e um novo escopo. O espaço para nome é o novo hash local de nomes. O escopo é a cadeia implícita de espaços para nome que inicia no novo espaço para nome e, em seguida, percorre qualquer espaço para nome externo (escopo externo), até o espaço para nome global (escopo global) e para os recursos internos.
Os termos podem ser usados quase de forma intercambiável, mas não é porque eles significam a mesma coisa; é porque eles se sobrepõem muito ao que implicam.
fonte
Há um excelente artigo sobre namespaces do Python aqui . Para citar a parte relevante para responder sua pergunta sobre a referência entre escopos e espaços para nome:
Por exemplo, imagine um programa simples de laminação:
roll
possui seu próprio espaço para nome , mas os nomes no espaço para nome do módulo também estão no escopo .fonte