O escopo de nomes em Python é mantido através de Namespaces, que são dicionários que relacionam os nomes dos objetos (referências) e os objetos em si.
Normalmente, os nomes estão definidos em dois dicionários, que podem ser consultados através das funções locals()
e globals()
. Estes dicionários são atualizados dinamicamente em tempo de execução.
Variáveis globais podem ser ofuscadas por variáveis locais (pois o escopo local é consultado antes do escopo global). Para evitar isso, é preciso declarar a variável como global no escopo local.
Exemplo:
In [1]:
def somalista(lista):
"""
Soma listas de listas, recursivamente
Coloca o resultado como global
"""
global soma
for item in lista:
if type(item) is list: # Se o tipo do item for lista
somalista(item)
else:
soma += item
soma = 0
somalista([[1, 2], [3, 4, 5], 6])
print soma # 21
Usar variáveis globais não é considerada uma boa prática de desenvolvimento, pois tornam mais difícil entender o sistema, portanto é melhor evitar seu uso. E ofuscar variáveis também.
In [1]:
Out[1]: