Variáveis globais em Python

pythonglobal1_abertura.png

Em Python, as variáveis definidas ficam acessíveis às funções declaradas dentro de um mesmo escopo mas há alguns detalhes a se considerar para utilizá-las de forma efetivamente global e “meio global” — no caso algo mais específico da versão 3.x do Python.

Um exemplo bem simples:

Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a=10
>>> def f1():
...     print a
... 
>>> f1()
10

O problema ocorre quando a função tenta modificar o conteúdo da variável global:

>>> def f2():
...     a = a ** a
... 
>>> f2()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 2, in f2
UnboundLocalError: local variable 'a' referenced before assignment

Acontece que o conteúdo da variável está disponível somente em um contexto de apenas leitura e o interpretador tenta atribuir e utilizar na operação a uma variável “a” local — que não foi definida — ao invés da variável “a” que é global.

A solução neste caso é bastante simples, basta declarar dentro da função¹ que a variável “a” a ser utilizada aqui dentro é a global:

>>> def f3():
...     global a
...     a = a ** a
... 
>>> f3()
>>> f1()
10000000000

Pronto, agora a variável funciona efetivamente dentro de um escopo global.

E especificamente na versão 3.x do Python, há um outra declaração de variáveis, a “nonlocal”:

Ela foi especialmente desenhada para o uso com funções aninhadas (funções que ficam dentro de uma função) para garantir acesso de escrita às variáveis no escopo desta função ao invés dos escopo da função aninhada.

$ python3 nonlocal_global.py
f1 b=3125
f2 b=10000000000

Neste caso a função f1 utilizou a variável “b” do escopo da função, de valor 5, enquanto que f2 usou a variável “b” do escopo global, de valor 10.

Para encerrar, o Style Guide for Python Code (a PEP8) recomenda o uso de variáveis globais somente dentro de módulos e tomando os devidos cuidados para não exportá-la para fora do contexto destes, ou seja, use mas com cuidado. E o Google Python Style Guide, mais direto, simplesmente sugere evitar sua utilização.

 

Até!

(¹) Pois é, justamente o inverso do que acontece em outras linguagens de programação onde este tipo de declaração ficaria do lado de fora da função.

Anúncios

Um comentário sobre “Variáveis globais em Python

  1. Pingback: Variáveis globais em Python | Zion Eco

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s