{ "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": {} } ] }