[Curso de Python] Escopo de Variáveis Parte 3
por
em 09-09-2010 às 13:31 (8036 Visualizações)
Antes de prosseguir leia os artigos anteriores aqui
Olá pessoal! Na última aula vimos mais sobre variáveis globais, hoje vamos ver um pouco sobre as variáveis locais e onde elas ocorrem.
Escopo de Variáveis Parte 3
Como eu disse anteriormente as variáveis globais (de escopo global) podem ser utilizadas em qualquer parte do código. Para acesso como "leitura" da variável global basta referenciá-la normalmente. Já para "escrever" na variável é necessário "declara-la" como global utilizando o comando global.
Muitas pessoas tem dificuldade de entender o escopo global. Eu costumo dizer que para entender e saber usar o escopo global você tem que entender o escopo local. Mas então porque eu não expliquei o escopo local antes? Simples, porque para entender o escopo local você precisa ter passado pelo escopo global.
O que eu quis dizer é que sesse conteúdo é algo que você não consegue estudar linearmente. Depois de estudar o escopo local é altamente recomendado que vocês voltem e estudem o escopo global.
Mas o que é o escopo de variáveis locais? Escopo local (ou variáveis locais) são variáveis que existem somente "dentro" de um certo trecho de código. Diferentemente das variáveis globais, uma variável local só pode ser acessada pelo trecho de código "responsável" por ela. Na aula passada eu havia comentado que existe apenas um escopo global, mas podem existir diversos escopos locais.
Mas então, que trechos de códigos "criam" escopos locais? Somente funções e métodos de classe. Vamos ver como consultar o escopo de variáveis locais do seu programa:
Código python:>>> x = 1 >>> texto = 'teste' >>> >>> locals().keys() ['__builtins__', 'texto', '__package__', 'x', '__name__', '__doc__'] >>> >>> locals() {'__builtins__': <module '__builtin__' (built-in)>, 'texto': 'teste', '__package __': None, 'x': 1, '__name__': '__main__', '__doc__': None} >>>
Como podemos ver o escopo local é idêntico ao escopo global pois não estamos dentro de uma função. Segue a comparação:
Código python:>>> globals() {'__builtins__': <module '__builtin__' (built-in)>, 'texto': 'teste', '__package __': None, 'x': 1, '__name__': '__main__', '__doc__': None} >>> >>> locals() {'__builtins__': <module '__builtin__' (built-in)>, 'texto': 'teste', '__package __': None, 'x': 1, '__name__': '__main__', '__doc__': None} >>>
Como dito, o escopo local será diferenciado somente dentro de funções e métodos de classe. Como ainda não vimos orientação a objeto, utilizarei somente funções nos exemplos.
Código python:>>> teste() >>> def teste(): ... print locals() ... >>> >>> teste() {} >>>
Como podemos ver, o retorno da função locals() dentro da função teste retorna um dicionário vazio. Vamos ver aquele exemplo da aula passada:
Código python:>>> x = 1 >>> def altera_x(): ... print 'variaveis locais:',locals() ... x = 10 ... print 'variaveis locais:',locals() ... >>> print 'x é',x x é 1 >>> altera_x() variaveis locais: {} variaveis locais: {'x': 10} >>> print 'x ainda é',x x ainda é 1 >>>
Como podemos ver, depois de "tentar" atribuir um valor ao x, é criada uma variável local. Essa variável só existe dentro da função, ela é destruída assim que a função acaba de ser executada. Dessa forma temos que tomar cuidados extra ao criar variáveis dentro de funções e métodos de classes, pois eles estão restritos àquele trecho de código.
Se sua intenção é "repassar algo" obtido dentro de uma função para outro trecho de código, você pode usar variáveis globais, mas isso é altamente desencorajado e considerado uma má prática. O método correto é você retornar o valor de interesse.
É isso ai pessoal, pratiquem esses conceitos pois eles são essenciais. Até mais...
Comentários
+ Enviar Comentário