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/