[Python-es] scope de variables

Chema Cortes pych3m4 en gmail.com
Vie Jun 18 20:04:41 CEST 2010


El día 18 de junio de 2010 16:25, Dr. Bobus <drbobus en gulic.org> escribió:

> Bien, veo que acabaré usando un diccionario.
>
> Pero hay algo que no entiendo veamos ...
>
> este código funciona: http://snipt.org/Qkkj
> pero este otro no: http://snipt.org/Qkkk
>
> Sinceramente no lo entiendo.

Adelanto que el ámbito (scope) en funciones anidadas tiene algunas
peculiaridades:

Una variable es local sólo si se realizar alguna asignación. Si no se
hace una asignación, sino que sólo se usa para leer su valor, entonces
se emplea el ámbito de la función padre para evaluar la variable en
lugar de crear un ámbito nuevo.

http://docs.python.org/faq/programming#id9


La función eval y el comando exec usan por defecto el diccionario de
datos local() para realizar la evaluación. Si lo pruebas, verás que
como locals() devuelve {'z': 1} en tu primer caso y {} en el segundo
(o sea, no ve ninguna variable z)

Mi consejo es que te crees un diccionario para mantener el ámbito de
evaluación de tus funciones y pases este diccionario como argumento al
eval. Por poner un ejemplo:

def main():

    def g(scope):
        print eval("z",scope)
        exec "z+=1" in scope

    scope={"z":1}
    g(scope)      #retorna 1
    g(scope)      #retorna 2
    g(scope)      #retorna 3


main()


Más información sobre la lista de distribución Python-es