[Curso de Python] Escopo de Variáveis Parte 3
9 de Setembro de 2010, 0:00 - sem comentários aindaAntes 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...
[Curso de Python] Escopo de Variáveis Parte 2
6 de Setembro de 2010, 0:00 - sem comentários aindaAntes de prosseguir leia os artigos anteriores aqui
Olá pessoal! Na última aula tivemos uma breve introdução sobre os escopo de variáveis, hoje veremos mais características do escopo global.
Escopo de Variáveis Parte 2
O escopo global vale para todo o programa e pode ser acessado por qualquer trecho de código. Vamos ver alguns exemplos de saída do comando globals() em determinadas estruturadas de código:
Código python:>>> x = 1 >>> >>> def teste(): ... print globals().keys() ... >>> >>> teste() ['__builtins__', '__package__', 'teste', 'x', '__name__', '__doc__'] >>>
Como podemos ver, ao chamar a função o comando globals mostra a variável x criada "fora" da função. Logo deduzimos que podemos acessar a variável, conseqüentemente achamos que podemos alterar as variáveis. Vamos a um exemplo:
Código python:>>> x = 1 >>> >>> def mostra_x(): ... print 'x dentro da funcao:',x ... >>> altera_x() x dentro da funcao: 1
Como imaginamos, o x foi acessado com sucesso de dentro da variável, agora vamos ver um exemplo de alteração da variável x:
Código python:>>> x = 1 >>> >>> def altera_x(): ... x = 10 ... print 'x:',x ... >>> print 'x:',x x: 1 >>> altera_x() x: 10 >>> print 'x:',x x: 1 >>>
Aqui começamos a nos confundir, se eu consegui mostrar o valor de x, porque ao alterar o x, ele continua como 1. Pensando um pouco mais, como dentro da função eu consegui atribuir o valor 10 à variável x? Novamente, tudo isso é culpa do escopo. Vamos usar o comando globals() para visualizar a variável x:
Código python:>>> x = 1 >>> def altera_x(): ... print globals() ... x = 10 ... print '\nx alterado:',x ... print '\n' ... print globals() ... >>> print 'x:',x x: 1 >>> altera_x() {'__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'teste' : <function teste at 0x00B410F0>, 'x': 1, '__name__': '__main__', 'altera_x': <f unction altera_x at 0x00B41030>, '__doc__': None} x alterado: 10 {'__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'teste' : <function teste at 0x00B410F0>, 'x': 1, '__name__': '__main__', 'altera_x': <f unction altera_x at 0x00B41030>, '__doc__': None} >>> >>> print 'x:',x x: 1 >>>
Pronto, agora podemos ver que no início da função o valor de x é 1 (saída da função globals()). Quando alteramos o valor de x, chamamos o print que mostra o valor de x como sendo 10. Na segunda chamada da função globals podemos ver que x ainda é 1. Então fica a pergunta, que x é aquele que alteramos? A resposta é simples: é um x local!
Sim, isso mesmo! É um x local. Complicou, ne?! Por enquanto vamos deixar, isso será explicado com mais calma quando falarmos de escopo local. Vamos apenas aprender como alterar o valor do x global:
Código python:>>> x = 1 >>> >>> def altera_x(): ... global x ... print 'valor global:',x ... x = 10 ... print 'valor global:',x ... >>> >>> print 'x:',x x: 1 >>> altera_x() valor global: 1 valor global: 10 >>> print 'x:',x x: 10 >>>
Pronto, utilizando a chamada global x podemos "ter acesso" ao valor global de x e alterá-lo.
Ok, por hoje é só pessoal. Com certeza deve ter muita gente perdida nessa aula. Vamos deixar esse conceito "assentar" na mente e continuaremos na próxima aula! Até mais...