[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