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
, True
e 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:
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.py
módulo, Python procura a print
função no escopo do módulo ( app.py
).
Como o Python não encontra a definição da print
função no app.py
escopo do módulo, o Python vai até o escopo envolvente, que é o escopo integrado, e procura a print
função lá. Neste caso, ele pode encontrar a print
função no escopo integrado.
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 counter
escopo global atual. Portanto, o Python procura por isso no escopo envolvente, que é o escopo integrado.
No entanto, a variável counter
não existe no escopo interno. Portanto, Python emite uma NameError
exceção:
NameError: name 'counter' is not defined
Linguagem 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 result
Linguagem 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 increment
função ao escopo global. Além disso, Python determina que as variáveis , e dentro da counter
função by
serão locais para a função. E o Python não criará as variáveis e até que a função seja executada.result
increment()
increment()
counter
by
result
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
, by
e result
no namespace local e as vincula aos valores 10
, 2
e 12
.
Quando a função for concluída, o Python excluirá o escopo local. E todas as variáveis locais, como counter
, by
e result
variá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
, by
e result
, e os vincula aos valores 100
,, 3
e 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 counter
variá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 counter
variá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
10
Linguagem de código: Sessão Shell ( shell )
Em tempo de compilação, Python interpreta counter
como uma variável local.
Quando reset()
a função está em execução, o Python encontra counter
no escopo local. A print(counter)
instrução dentro da reset()
função mostra o valor de counter
, que é zero.
Quando imprimimos counter
após a reset()
conclusão da função, ela mostra 10.
Neste exemplo, a counter
variável local mascara a counter
variável global.
Se quiser acessar uma variável global de dentro de uma função, você pode usar a global
palavra-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 counter
Linguagem de código: PHP ( php )
…instrui o Python que a counter
variá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
global
palavra-chave se quiser acessar uma variável global de dentro de uma função.