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

Next Section - Funções podem chamar outras funções