Variáveis e Parâmetros são Locais¶
Um comando de atribuição em uma função cria uma variável local. Ela é denominada dessa
forma porque só existe dentro da função, e não pode ser usada fora. Por exemplo, considere
novamente a função quadrado
:
(bad_local)
Se você pressionar o botão ‘last >>’ verá uma mensagem de erro.
Quanto tentamos usar y
na linha 6 (fora da função) Python procura pela variável
global chamada y
, mas não encontra. Isso resulta no erro:
Name Error: 'y' is not defined.
A variável y
somente existe enquanto a função está sendo executada —
chamamos isso de tempo de vida.
Quando a execução da função termina (isto é, ela retorna), as variáveis locais são destruídas.
O codelens nos ajuda a visualizarmos isso, porque as variáveis locais somem quando a função retorna.
Volte e ande novamente pelos comandos, prestando atenção às variáveis que são criadas quando a função
é chamada. Repare que elas desaparecem quando a função retorna.
Parâmetros formais também são locais e agem como variáveis locais.
Por exemplo, o tempo de vida de x
começa quando quadrado
é chamada,
e acaba quando a função completa sua execução.
Por outro lado, é permitido a uma função acessar uma variável global. Porém, isso é considerado uma prática ruim por praticamente qualquer programador, e deve ser evitado. Veja a seguinte variação sem sentido da função quadrado:
Apesar da função quadradoRuim
funcionar, a forma como está escrita não faz sentido. Fizemos isso
aqui para ilustrar essa regra importante sobre o acesso de variáveis em Python.
Primeiro, Python procura nas variáveis que são definidas como variáveis locais na função. Nós chamamos
isso de escopo local. Se o nome não for encontrado no escopo local, então Python procura nas
variáveis globais, ou escopo global. Isso é exatamente o caso mostrado acima: potencia
não é
encontrado localmente em quadradoRuim
, mas existe globalmente.
A forma correta de escrever essa função seria passando a potência como outro parâmetro. Pratique isso, escrevendo a função corretamente.
Há outro detalhe aqui: comandos de atribuição dentro da função não podem alterar variáveis criadas fora da função. Veja o seguinte exemplo no codelens:
(cl_powerof_bad)
Agora execute o código passo a passo: o que você percebe sobre os valores da variável pot
no escopo local, comparando com a variável pot
no escopo global?
O valor de pot
no escopo local era diferente do valor no escopo global.
Isso acontece porque neste exemplo pot
foi usada em uma atribuição: pot = p
.
Quando uma variável é usada do lado esquerdo de um comando de atribuição, Python cria uma
variável local. Quando uma variável local tem o mesmo nome de uma variável global, dizemos que
a local sobrepõe a global. Uma sobreposição significa que variável global não pode ser
acessada por Python porque a variável local será encontrada primeiro. Essa também é uma boa
razão para não usar variáveis globais dentro de funções. Como você pode ver, isso só deixa o seu
código confuso e difícil de entender.
Para finalizar, vamos analisar um último exemplo.
Dentro da função quadrado
faremos uma atribuição ao parâmetro x
. Não há nenhum
bom motivo para fazer isso, além de enfatizar o fato que o parâmetro x
é uma variável local.
Se você executar o código passo a passo, o x
no escopo global permanece sempre igual a 2.
Isso confunde muitos programadores iniciantes que imaginarão que a atribuição ao parâmetro formal
irá alterar a variável que foi usada como argumento, especialmente porque os dois têm o mesmo nome.
Mas esse exemplo demonstra claramente que não é assim que isso acontece em Python.
(cl_change_parm)
Veja se você entendeu
-
func-3-1: O que é o escopo de uma variável?
- O seu valor
- Valor é conteúdo, escopo diz respeito onde a variável é "conhecida".
- O local no programa onde a variável pode ser acessada.
- O seu nome
- O nome da variável é apenas um identificador (ou apelido). Escopo diz respeito onde a variável é "conhecida".
-
func-3-2: O que é uma variável local?
- Uma variável temporária que só é usada dentro de uma função
- Sim, uma variável local é uma variável temporária que só é conhecida (somente existe) na função onde foi criada.
- O mesmo que um parâmetro
- Apesar de parâmetros serem considerados variáveis locais, funções também podem definir e usar outras variáveis locais.
- Outro nome para qualquer variável
- Variáveis que são usadas fora de uma função não são locais, mas sim globais.