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