Introdução à programação e aos algoritmos
4.6 Global ou Local
Figura 4.12 Passagem de parâmetros em Python.
Não se preocupe com o nome dado. Entenda o que Python faz
sem procurar classificar.
4.6 GLOBAL OU LOCAL
Você já deve ter percebido que o nome de uma variável sempre deve aparecer primeiro do lado esquerdo de uma expressão. Isto quer dizer que uma variável deve ser criada antes de ser usada.
Um programa do tipo:
1 y = x + 1
2 x = 0
tem obviamente um erro. Não posso usar o valor de x antes de definir seu valor. A partir do momento em que uma variável é criada, já pode ser usada.
Porém, a variável tem um escopo. O escopo de uma variável diz
onde, dentro de seu programa, você pode referenciá-la. No caso apresentado é óbvio: o escopo da variável x inicia a partir da linha 2.
Quando uma variável é criada dentro de uma função, seu escopo
é o corpo dessa função. Fora da função, a variável não existe. Da mesma forma, variáveis criadas fora de qualquer função são variáveis globais, e assim são visíveis em qualquer função chamada após a sua criação.
Vamos a um exemplo.
1 global_y = 1
2
3 def foo(par): #par existe somente dentro de foo( )
4 local_y = 20
5 print(‘local_y =’, local_y)
6 print(‘global_y =’, global_y) 7 for i in range(1, 2):
8 print(‘i =’, i)
9 print(‘i =’, i)
10
11 foo(global_y)
■ Programa 4.19: Variáveis globais e locais.
O Programa 4.19 tem como resultado:
local_y = 20
global_y = 1
i = 1
i = 1
A variável global_y é global, pois foi declarada fora do corpo de qualquer função. Essa variável pode ter seu valor acessado em qualquer ponto do programa. Já as variáveis par, local_y e i são locais à função foo(). Isto quer dizer que somente dentro do corpo de foo() as duas podem ser manipuladas. Uma variável como i, criada para o laço for continua a existir dentro da função, mesmo depois que o laço termina. No caso, essa variável guardará o último valor de i. Nunca é uma boa ideia usar esse tipo de valor fora do laço, por isso é melhor ignorar esse fato.
Vejamos outra situação.
1 y = 1
2
3 def foo():
4 y = 42
5 print(‘y =’, y)
6 print(‘x =’, x)
7
8 x = 84
9 foo()
■ Programa 4.20: Variáveis globais e locais com mesmo nome.
Esse programa tem o seguinte resultado:
y = 42
x = 84
O resultado comprova que x é uma variável global, mesmo
sendo criada depois da definição da função. O importante aqui é que foi criada antes da chamada a foo(), mas, o que aconteceu com y?
A variável y local à função tem precedência sobre a variável y
global, assim o valor impresso é 42.
Veja a seguinte situação de erro:
y = 1
def foo():
print(‘y =’,y)
y = 42
foo()
■ Programa 4.21: Variáveis globais e locais com mesmo nome
e erro.
A variável y tem precedência sobre a y global, mas como foi feita
a tentativa de imprimir seu valor antes de ser criada, o interpretador Python acusou um erro. Isso ensina algo importante: uma variável local existe a partir do momento em que é criada, mas seu escopo é toda a função na qual foi definida.
Mais uma situação de erro.
def foo():
print(‘y =’,y)
print(‘x =’,x)
y = 42
foo()
x = 84
■ Programa 4.22: Variáveis globais e erro.
Nesse último caso, a variável y é acessada corretamente por foo(). O problema é a variável x. Veja que, apesar de x ser global, é criada após a chamada a foo(), não sendo portanto ainda conhecida.
Esses erros nem são tão graves, pois o interpretador Python vai avisar antes da execução e você pode corrigir. O pior são as consequências não evidentes das variáveis globais.
Dica 4.3 – Evite variáveis globais. Evite dores de cabeça.
Variáveis globais são uma grande fonte de dor de cabeça: di cultam a manutenção
do código e têm o que chamamos de “efeito colateral”. A modi cação do valor de
uma variável global se propaga por todas as funções e pode afetar o comportamento
da função.
Use apenas valores globais para constantes e mesmo assim indique isso em
letras maiúsculas:
C = 299792458 #m/s