Introdução às variáveis globais e locais em Python
Publicados: 2021-08-26Python lida com variáveis de uma maneira muito independente. Enquanto muitas linguagens de programação consideram as variáveis como globais por padrão (a menos que sejam declaradas como locais), o Python considera as variáveis como locais, a menos que sejam declaradas ao contrário. A razão principal por trás do Python considerar variáveis como locais por padrão é que o uso de variáveis globais geralmente é considerado uma prática de codificação ruim.
Assim, ao programar em Python, quando a definição de variáveis ocorre dentro de uma função, elas são locais por padrão. Quaisquer modificações ou manipulações que você fizer nesta variável dentro do corpo da função permanecerão apenas dentro do escopo desta função. Ou, em outras palavras, essas mudanças não serão refletidas em nenhuma outra variável fora da função, mesmo que a variável tenha o mesmo nome da variável da função. Todas as variáveis existem no escopo da função em que são definidas e mantêm esse valor. Para obter experiência prática em variáveis e projetos python, experimente nossas certificações de ciência de dados das melhores universidades dos EUA.
Por meio deste artigo, vamos explorar a noção de variáveis locais e globais em Python, juntamente com como você define variáveis globais. Também veremos algo conhecido como “variáveis não locais”.
Leia!
Índice
Variáveis globais e locais em Python
Vejamos um exemplo para entender como os valores globais podem ser usados no corpo de uma função em Python:
Programa:
def func():
imprima(cadeia)
string = “Eu amo Python!”
func()
Saída
Eu amo Python!
Como você pode ver, a variável string recebe o valor “I love Python!” antes de func() ser chamado. O corpo da função consiste apenas na instrução print. Como não há atribuição para a variável string dentro do corpo da função, ela assumirá o valor da variável global.
Como resultado, a saída será qualquer que seja o valor global da variável string, que neste caso é “I love Python!”.
Agora, vamos alterar o valor da string dentro do func() e ver como isso afeta as variáveis globais:
Programa:
def func():
string = “Eu amo Java!”
imprima(cadeia)
string = “Eu amo Python!”
func()
imprima(cadeia)
Saída:
Eu amo Java!
Eu amo Python!
No programa acima, definimos uma função func(), e dentro dela, temos uma variável string com o valor “I love Java!”. Portanto, esta variável é local para a função func(). Então, temos a variável global como antes, e então chamamos a função e a instrução print. Primeiro, a função é acionada, chamando a instrução print dessa função e entregando a saída “I love Java!” – que é a variável local para essa função. Então, uma vez que o programa está fora do escopo da função, o valor de s é alterado para “I love Python”, e é por isso que obtemos ambas as linhas como saída.
Agora, vamos adicionar os dois primeiros exemplos e tentar acessar a string usando a instrução print e, em seguida, tentar atribuir um novo valor a ela. Essencialmente, estamos tentando criar uma string como uma variável local e global.
Felizmente, o Python não permite essa confusão e gera um erro. Veja como:
Programa:
def func():
imprima(cadeia)
string = “Eu amo Java!”
imprima(cadeia)
string = “Eu amo Python!”
func()
Saída (Erro):
—————————————————————————
UnboundLocalError Traceback (última chamada mais recente)
<ipython-input-3-d7a23bc83c27> em <module>
5
6 string = “Eu amo Python!”
—-> 7 func()
<ipython-input-3-d7a23bc83c27> em func()
1 def func():
—-> 2 print(string)
3 string = “Eu amo Java!”
4 imprimir (cadeia)
5
UnboundLocalError: variável local 's' referenciada antes da atribuição
Evidentemente, o Python não permite que uma variável seja global e local dentro de uma função. Então, isso nos dá uma variável local, já que atribuímos um valor à string dentro do func(). Como resultado, a primeira instrução de impressão mostra a notificação de erro. Todas as variáveis criadas ou alteradas dentro do escopo de qualquer função são locais, a menos que tenham sido declaradas como “globais” explicitamente.
Definindo variáveis globais em Python
A palavra-chave global é necessária para informar ao Python que estamos acessando variáveis globais. Veja como:
Programa:
def func():
seqüência global
imprima(cadeia)
string = “Mas eu quero aprender Python também!”
imprima(cadeia)
string = “Estou procurando aprender Java!”
func()
imprima(cadeia)
Saída:
Estou querendo aprender Java!
Mas eu quero aprender Python também!
Mas eu quero aprender Python também!
Como você pode ver na saída, o Python reconhece as variáveis globais aqui e avalia a instrução print de acordo, fornecendo a saída apropriada.
Usando variáveis globais em funções aninhadas
Agora, vamos examinar o que acontecerá se variáveis globais forem usadas em funções aninhadas. Confira este exemplo onde a variável 'language' está sendo definida e utilizada em diversos escopos:
Programa:
def func():
idioma = “inglês”
def func1():
linguagem global
idioma = “espanhol”
print(“Antes de chamar func1: ” + idioma)
print("Chamando func1 agora:")
func1()
print(“Após chamar func1: ” + idioma)
func()
print(“Valor do idioma em main: ” + idioma)
Saída:
Antes de chamar func1: Inglês
Chamando func1 agora:
Depois de chamar func1: Inglês
Valor do idioma em principal: espanhol
Como você pode ver, a palavra-chave global, quando usada dentro do func1 aninhado, não tem impacto na variável 'language' da função pai. Ou seja, o valor é retido como “inglês”. Isso também mostra que depois de chamar func(), existe uma variável 'language' no namespace do módulo com um valor 'Spanish'.
Essa descoberta é consistente com o que descobrimos na seção anterior – que uma variável, quando definida dentro do corpo de uma função, é sempre local, a menos que especificado de outra forma. No entanto, deve haver um mecanismo para acessar as variáveis pertencentes a diferentes outros escopos também.
É aí que entram as variáveis não-locais!
Variáveis Não Locais
Variáveis não locais são novos tipos de variáveis introduzidas pelo Python3. Elas têm muito em comum com variáveis globais e também são extremamente importantes. No entanto, uma diferença entre variáveis não locais e globais é que as variáveis não locais não permitem alterar as variáveis do escopo do módulo.
Confira os exemplos a seguir para entender isso:
Programa:
def func():
linguagem global
imprimir(idioma)
idioma = “alemão”
func()
Saída:
alemão
Como esperado, o programa retorna 'Frankfurt' como saída. Agora, vamos mudar 'global' para 'nonlocal' e ver o que acontece:
Programa:
def func():
idioma não local
imprimir(idioma)
idioma = “alemão”
func()
Saída:
Arquivo “<ipython-input-9-97bb311dfb80>”, linha 2
idioma não local
^
SyntaxError: nenhuma ligação para 'idioma' não local encontrada
Como você pode ver, o programa acima gera um erro de sintaxe. Podemos compreender a partir daqui que atribuições não-locais só podem ser feitas a partir da definição de funções aninhadas. Variáveis não locais devem ser definidas dentro do escopo da função e, se não for o caso, ela também não poderá encontrar sua definição no escopo aninhado. Agora, confira o seguinte programa:
Programa:
def func():
idioma = “inglês”
def func1():
idioma não local
idioma = “alemão”
print(“Antes de chamar func1: ” + idioma)
print("Chamando func1 agora:")
func1()
print(“Após chamar func1: ” + idioma)
idioma = “espanhol”
func()
print(“'idioma' em main: ” + idioma)
Saída:
Antes de chamar func1: Inglês
Chamando func1 agora:
Depois de chamar func1: alemão
'idioma' em principal: espanhol
O programa acima funciona porque a variável 'language' foi definida antes de chamar o func1(). Se não estiver definido, receberemos um erro como abaixo:
Programa:
def func():
#idioma = “inglês”
def func1():
idioma não local
idioma = “alemão”
print(“Antes de chamar func1: ” + idioma)
print("Chamando func1 agora:")
func1()
print(“Após chamar func1: ” + idioma)
idioma = “espanhol”
func()
print(“'idioma' em main: ” + idioma)
Saída:
Arquivo “<ipython-input-11-5417be93b6a6>”, linha 4
idioma não local
^
SyntaxError: nenhuma ligação para 'idioma' não local encontrada
No entanto, o programa funcionará bem se substituirmos não local por global:
Programa:
def func():
#idioma = “inglês”
def func1():
linguagem global
idioma = “alemão”
print(“Antes de chamar func1`: ” + idioma)
print("Chamando func1 agora:")
func1()
print(“Após chamar func1: ” + idioma)
idioma = “espanhol”
func()
print(“'idioma' em main: ” + idioma)
Saída:
Antes de chamar func1: Inglês
Chamando func1 agora:
Depois de chamar func1: alemão
'idioma' em main: alemão
Se você notar, o valor da variável global (idioma) também está sendo alterado no programa acima! Esse é o poder que as variáveis não locais trazem consigo!
Para concluir
Neste artigo, discutimos variáveis locais, globais e não locais em Python, juntamente com diferentes casos de uso e possíveis erros que você deve observar. Com esse conhecimento ao seu lado, você pode ir em frente e começar a praticar com diferentes tipos de variáveis e perceber as diferenças sutis.
Python é uma linguagem de programação extremamente popular em todo o mundo – especialmente quando se trata de resolver problemas e desafios relacionados a dados. No upGrad, temos uma base de alunos em mais de 85 países, com mais de 40.000 alunos pagos em todo o mundo, e nossos programas impactaram mais de 500.000 profissionais. Nossos cursos de Ciência de Dados e Aprendizado de Máquina foram desenvolvidos para ajudar alunos motivados de qualquer formação a iniciar sua jornada e se destacar no campo da ciência de dados. Nossa assistência de carreira 360 graus garante que, uma vez matriculado conosco, sua carreira só avança. Entre em contato conosco hoje mesmo e experimente o poder do aprendizado entre pares e da rede global!
Com base em seu escopo, as variáveis em Python são locais, globais ou não locais. Sim, variáveis globais podem ser acessadas de dentro de uma função em Python. As variáveis globais têm o programa inteiro como escopo, enquanto as variáveis locais têm apenas a função na qual são definidas como escopo.Quais são os tipos de variáveis em Python?
As variáveis globais em Python podem ser acessadas de dentro de uma função?
Qual é a diferença entre variáveis locais e globais?