English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico Python

Controle de Fluxo Python

Funções do Python

Tipos de Dados do Python

Operações de Arquivo Python

Objetos e Classes Python

Data e Hora Python

Conhecimento Avançado Python

Manual de Referência Python

Espaço de Nomes e Escopo do Python

Neste artigo, você vai entender namespace, do mapeamento de nome para objeto até o escopo de variáveis.

O que é namespace em Python?

Se você já leu o 'The Zen of Python' (digite import this no interpretador Python), a última linha aponta que,Um namespace é uma ideia excelente-Vamos fazer mais coisas!Então, o que são esses namespaces misteriosos? Primeiro, vamos ver o que é um nome.

o nome (também conhecido como identificador) é o nome atribuído ao objeto. Tudo em Python éobjeto. O nome é uma maneira de acessar o objeto básico.

Por exemplo, quando realizamos uma operação de atribuição, a = 2,2é um objeto armazenado na memória, enquantoaé o nome associado a ele. Podemos acessar o objeto básico através deFunções integradas Obter o endereço de alguns objetos (no RAM) usando id(). Vamos ver como usá-lo.

# Atenção: Você pode obter valores de id diferentes
a = 2
print('id(2) =', id(2))
print('id(a) =', id(a))

Resultados de saída

id(2) = 9302208
id(a) = 9302208

Aqui, ambos referenciam o mesmo objeto2portanto, eles têm o mesmo id(). Vamos fazer algo interessante.

# Atenção: Você pode obter valores de id diferentes
a = 2
print('id(a) =', id(a))
a = a+1
print('id(a) =', id(a))
print('id(3) =', id(3))
b = 2
print('id(b) =', id(b))
print('id(2) =', id(2))

Resultados de saída

id(a) = 9302208
id(a) = 9302240
id(3) = 9302240
id(b) = 9302208
id(2) = 9302208

O que acontece na sequência dos passos acima? Vamos explicar com um gráfico:

Gráfico de memória de variáveis no Python

Inicialmente, é criado um objeto2E associado ao nome a, quando executamos a = a + 1Quando, é criado um novo objeto3Agora a está associada ao objeto

Observe que id(a) e id(3) tem o mesmo valor.

Além disso, quando executamos b = 2Quando, o novo nome b está associado ao objeto anterior2Relacionado.

Isso é válido porque o Python não precisa criar novos objetos repetidos. A característica dinâmica dessa ligação de nome permite que o Python seja poderoso. Os nomes podem referenciar qualquer tipo de objeto.

>>> a = 5
>>> a = 'Hello World!'
>>> a = [1,2,3]

Todos isso são válidos eaVamos referenciar três tipos diferentes de objetos em diferentes exemplos.FunçãoTambém são objetos, portanto, os nomes também podem referenciá-los.

def printHello():
    print("Hello")
a = printHello
a()

Resultados de saída

Hello

Mesmos nomesaPodemos referenciar uma função e usar esse nome para chamar a função.

O que é o namespace no Python?

Agora que entendemos o que é um nome, podemos continuar com o conceito de namespace.

Em resumo, o namespace é um conjunto de nomes.

No Python, você pode imaginar um namespace como um mapeamento de cada nome para o objeto correspondente.

Diferentes namespaces podem coexistir em um dado momento, mas estão completamente isolados.

Quando iniciamos o interpretador Python, é criado um namespace que contém todos os nomes integrados e ele existe enquanto o interpretador estiver em execução.

É por isso que funcionalidades integradas (como id()) e print() sempre podem ser usadas em qualquer parte do programa. CadaMóduloCrie seu próprio namespace global.

Esses namespaces diferentes são isolados. Portanto, nomes idênticos que podem existir em diferentes módulos não entrarão em conflito.

Os módulos podem ter várias funções e classes. Ao chamar uma função, é criado um namespace local, onde são definidos todos os nomes. Semelhante a classes. A figura a seguir pode ajudar a ilustrar esse conceito.

Gráfico de namespaces diferentes em Python

Escala de variáveis Python

Embora sejam definidas várias namespaces únicas, podemos não ter acesso a elas em cada parte do programa. O conceito de escopo começa a funcionar.

O escopo é uma parte do programa, onde é possível acessar o namespace diretamente sem qualquer prefixo.

Há pelo menos três escopos aninhados em qualquer momento.

  1. O escopo da função atual com nomes locais

  2. O escopo do módulo com nomes globais

  3. O escopo mais externo com nomes internos

Ao fazer referência dentro da função, a busca pelo nome ocorre no namespace local, em seguida, no namespace global e, finalmente, no namespace interno.

Se outro função tiver uma função, o novo escopo está aninhado dentro do escopo local.

Exemplo de escopo e namespace do Python

def outer_function():
    b = 20
    def inner_func():
        c = 30
a = 10

Aqui, a variávelano namespace global. A variávelbno namespace local de outer_function() enquantocno namespace local aninhado de inner_function().

ao invés de inner_function(),cno nosso localbno não localano global. Podemos definircler e atribuir um novo valor, mas apenas lê-lobeainner_function().

Se tentarmos atribuir como valorb, uma nova variávelbna criação diferente do namespace local e não localb. Quando atribuímos um valor, o mesmo aconteceum.

Mas, se atribuirmosadeclarada como global a, todas as referências e atribuições serão movidas para a variável globalaDa mesma forma, se quisermos reatribuir a variávelbSe precisar declarar como variável não local, o exemplo a seguir ilustra isso.

def outer_function():
    a = 20
    def inner_function():
        a = 30
        print('a =
    inner_function()
    print('a =
a = 10

print('a =

Como você vê, a saída do programa é

a = 30
a = 20
a = 10

Neste programa, foram definidas três variáveis diferentes em diferentes namespaces.ae realizou o acesso correspondente. No seguinte programa:

def outer_function():
    global a
    a = 20
    def inner_function():
        global a
        a = 30
        print('a =
    inner_function()
    print('a =
a = 10

print('a =

A saída do programa é.

a = 30
a = 30
a = 30

Aqui, devido ao uso da palavra-chave global, todas as referências e atribuições apontam para a variável global a.