Escopos de variáveis ​​​​Python

Resumo : neste tutorial, você aprenderá como funcionam os escopos de variáveis ​​​​do Python. Após o tutorial, você terá uma boa compreensão dos escopos integrados, locais e globais.

Introdução aos escopos de variáveis ​​​​do Python

Quando você atribui um objeto a uma variável , a variável fará referência a esse objeto na memória. E está dizendo que a variável está vinculada ao objeto.

Após a atribuição, você pode acessar o objeto usando o nome da variável em diversas partes do seu código. No entanto, você não pode acessar a variável em qualquer parte do código.

O nome da variável e sua ligação (nome e objeto) existem apenas em partes específicas do seu código.

A parte do código onde você define o nome/ligação é chamada de escopo léxico das variáveis.

Python armazena essas ligações em algo chamado namespaces. Cada escopo tem seu próprio namespace.

E você pode pensar que um namespace é uma tabela que contém o rótulo e a referência à qual o rótulo está vinculado.

Escopos globais

O escopo global é basicamente o escopo do módulo . O escopo global abrange apenas um único arquivo de código-fonte Python.

Python não tem um escopo verdadeiramente global que abranja todos os módulos, exceto o escopo integrado.

O escopo integrado é um escopo especial que fornece objetos disponíveis globalmente, como print, len, None, Truee False.

Basicamente, as variáveis ​​integradas e globais existem em todos os lugares dentro de um módulo.

Internamente, os escopos globais estão aninhados dentro do escopo integrado:

Escopos de variáveis ​​​​Python

Se você acessar uma variável de um escopo e o Python não a encontrar no namespace desse escopo, ele pesquisará no namespace do escopo anexo.

Suponha que você tenha a seguinte instrução em um módulo chamado app.py:

print('Hello')Linguagem de código:  Python  ( python )

Neste app.pymódulo, Python procura a printfunção no escopo do módulo ( app.py).

Como o Python não encontra a definição da printfunção no app.pyescopo do módulo, o Python vai até o escopo envolvente, que é o escopo integrado, e procura a printfunção lá. Neste caso, ele pode encontrar a printfunção no escopo integrado.

Escopo integrado do Python

Se você alterar a instrução para o seguinte, receberá um erro de tempo de execução:

print(counter)Linguagem de código:  Python  ( python )

Neste exemplo, Python não encontra no counterescopo global atual. Portanto, o Python procura por isso no escopo envolvente, que é o escopo integrado.

No entanto, a variável counternão existe no escopo interno. Portanto, Python emite uma NameErrorexceção:

NameError: name 'counter' is not definedLinguagem de código:  Sessão Shell  ( shell )

Escopos locais

Ao criar uma função , você pode definir parâmetros e variáveis ​​para a função. Por exemplo:

def increment(counter, by=1):
    result = counter + by
    return resultLinguagem de código:  Python  ( python )

Quando você executa o código, o Python passa por duas fases: compilação e execução.

Quando o Python compila o arquivo, ele adiciona a incrementfunção ao escopo global. Além disso, Python determina que as variáveis ​​, e dentro da counterfunção byserão locais para a função. E o Python não criará as variáveis ​​e até que a função seja executada.resultincrement()increment()counterbyresult

Cada vez que você chama uma função, o Python cria um novo escopo. Python também atribui as variáveis ​​definidas dentro da função a esse escopo. E esse escopo é chamado de escopo local de função ou escopo local.

No nosso exemplo, quando você chama a increment()função:

increment(10,2)Linguagem de código:  Python  ( python )

… Python cria um escopo local para a increment()chamada de função.

Além disso, o Python cria variáveis ​​locais counter, bye resultno namespace local e as vincula aos valores 10, 2e 12.

Quando a função for concluída, o Python excluirá o escopo local. E todas as variáveis ​​locais, como counter, bye resultvariáveis, estão fora do escopo. Se você tentar acessar essas variáveis ​​de fora da increment()função, receberá um erro.

E se você chamar a increment()função novamente:

increment(100,3)Linguagem de código:  Python  ( python )

… Python cria um novo escopo local e variáveis, incluindo counter, bye result, e os vincula aos valores 100,, 3e 103.

Pesquisas variáveis

Em Python, os escopos são aninhados. Por exemplo, os escopos locais são aninhados dentro de um escopo de módulo. E os escopos dos módulos estão aninhados dentro do escopo integrado:

Quando você acessa um objeto vinculado a uma variável, o Python tenta encontrar o objeto:

  • primeiro no escopo local atual.
  • e sobe na cadeia de escopos delimitadores se o Python não encontrar o objeto no escopo atual.

A palavra-chave global

Quando você recupera o valor de uma variável global de dentro de uma função, o Python pesquisa automaticamente o namespace do escopo local e sobe na cadeia de todos os namespaces do escopo envolvente. Por exemplo:

counter = 10


def current():
    print(counter)


current()Linguagem de código:  Python  ( python )

Neste exemplo, quando a current()função está em execução, o Python procura a countervariável no escopo local.

Como o Python não a encontra, ele procura a variável no escopo global. E o Python pode encontrar a countervariável no escopo global neste caso.

No entanto, se você atribuir um valor a uma variável global de dentro de uma função, o Python colocará essa variável no namespace local. Por exemplo:

counter = 10


def reset():
    counter = 0
    print(counter)


reset()
print(counter)
Linguagem de código:  Python  ( python )

Saída:

0 
10Linguagem de código:  Sessão Shell  ( shell )

Em tempo de compilação, Python interpreta countercomo uma variável local.

Quando reset()a função está em execução, o Python encontra counterno escopo local. A print(counter)instrução dentro da reset()função mostra o valor de counter, que é zero.

Quando imprimimos counterapós a reset()conclusão da função, ela mostra 10.

Neste exemplo, a countervariável local mascara a countervariável global.

Se quiser acessar uma variável global de dentro de uma função, você pode usar a globalpalavra-chave. Por exemplo:

counter = 10


def reset():
    global counter
    counter = 0
    print(counter) # 0


reset()

print(counter) # 0
Linguagem de código:  Python  ( python )

Saída:

0
0

Neste exemplo, a seguinte declaração:

global counterLinguagem de código:  PHP  ( php )

…instrui o Python que a countervariável está vinculada ao escopo global, não ao escopo local.

Observe que não é uma boa prática acessar a variável global dentro de uma função.

Resumo

  • Os escopos das variáveis ​​são as partes do código onde você pode acessar as variáveis.
  • O escopo integrado pode ser acessado de qualquer lugar.
  • O escopo global (ou escopo do módulo) pode ser acessível em qualquer parte do módulo.
  • O escopo local pode ser acessado de dentro de uma função.
  • Python armazena os objetos e suas ligações no namespace do escopo.
  • O Python procura primeiro um objeto no escopo atual e sobe para o escopo envolvente se o Python não o encontrar.
  • Os escopos do Python são aninhados.
  • Use a globalpalavra-chave se quiser acessar uma variável global de dentro de uma função.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *