El día 18 de junio de 2010 16:25, Dr. Bobus <drbo...@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()
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Reply via email to