Ver Feed RSS

root@blog:/# chmod o+r *

[Curso de Python] Escopo de Variáveis Parte 3

Avalie este Post de Blog

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...

Atualizado 09-09-2010 em 13:48 por Magnun

Categorias
Artigos , Artigos , Cursos , Curso de Python

Comentários

  1. Avatar de victoreng
    Finalmente consegui chegar na ultima aula e conseguir acompanhar o curso em tempo real agora.

    Agora é só estudar muito, e esperar a nova aula

    Abraços
  2. Avatar de Magnun
    Olá victoreng,

    Em breve novas aulas serão postadas! Até mais...
  3. Avatar de nennogabriel
    Suas aulas são muito boas... essa dica do globals() então... eu imáginava que seria possível chamar a função com string, mas nao imaginava que seria tão fácil...

    com essa dica eu criei uma função pra testar tempo de execução de funções para ordenar... é... você postou um desafio uma vez pra ordenar uma lista e eu fiz ... meio paia... bom... ai tive o problema com o .sort() no python3, e você me deu a idéia de blogar coisas sobre isso ... então tanto a função (besta) que fiz com globals() como o meu novo "ordena", estão no meu primeiro post [URL="http://phylogia.blogspot.com/2010/10/com-sort-chegava-primeiro.html"]aqui[/URL]
    se puder dar uma conferida e uma sugestão eu agradeço.
    Atualizado 02-10-2010 em 12:24 por nennogabriel
  4. Avatar de Magnun
    Olá Nenno Gabriel!

    Tentei comentar lá no seu blog mais deu um erro.

    Realmente foi uma ótima solução. A sacada de que a chamada da função min sobre uma lista de grandes proporções estava impactando no desempenho foi fundamental. Se quiser aprender mais sobre algoritmos de ordenação dê uma lida nessa página: Algoritmo de ordenação - Wikipédia, a enciclopédia livre

    Até mais...
  5. Avatar de fabraga
    Muito boas aulas! Falta bem pouco pra acabar...
    Amanhã eu continuo até terminar. Valeu!

+ Enviar Comentário