{
"metadata": {
"name": "Capitulo9_Escopo_de_nomes"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n",
"===================================\n",
"2ª edi\u00e7\u00e3o, revisada e ampliada\n",
"-----------------------------------\n",
"\n",
"Cap\u00edtulo 9: Escopo de nomes\n",
"=============================\n",
"_____________________________\n",
"O escopo de nomes em Python \u00e9 mantido atrav\u00e9s de *Namespaces*, que s\u00e3o dicion\u00e1rios que relacionam os nomes dos objetos (refer\u00eancias) e os objetos em si.\n",
"\n",
"Normalmente, os nomes est\u00e3o definidos em dois dicion\u00e1rios, que podem ser consultados atrav\u00e9s das fun\u00e7\u00f5es `locals()` e `globals()`. Estes dicion\u00e1rios s\u00e3o atualizados dinamicamente em tempo de execu\u00e7\u00e3o.\n",
"\n",
"![Namespaces](files/bpypd_diags7.png)\n",
"\n",
"Vari\u00e1veis globais podem ser ofuscadas por vari\u00e1veis locais (pois o escopo local \u00e9 consultado antes do escopo global). Para evitar isso, \u00e9 preciso declarar a vari\u00e1vel como global no escopo local.\n",
"\n",
"Exemplo:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def somalista(lista):\n",
" \"\"\"\n",
" Soma listas de listas, recursivamente\n",
" Coloca o resultado como global\n",
" \"\"\"\n",
" global soma\n",
" \n",
" for item in lista:\n",
" if type(item) is list: # Se o tipo do item for lista\n",
" somalista(item)\n",
" else:\n",
" soma += item\n",
"\n",
"soma = 0\n",
"somalista([[1, 2], [3, 4, 5], 6])\n",
"\n",
"print soma # 21"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"21\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Usar vari\u00e1veis globais n\u00e3o \u00e9 considerada uma boa pr\u00e1tica de desenvolvimento, pois tornam mais dif\u00edcil entender o sistema, portanto \u00e9 melhor evitar seu uso. E ofuscar vari\u00e1veis tamb\u00e9m."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
""
],
"output_type": "pyout",
"prompt_number": 1,
"text": [
""
]
}
],
"prompt_number": 1
}
],
"metadata": {}
}
]
}