jueves, 28 de febrero de 2008

Variables locales y variables globales

Ya vimos anteriormente que las variables se pueden clasificar segun su tipo, ejemplo entero (integer), decimal (float), cadena de caracteres (string) pero los variables tambien se pueden clasificar segun su ambito, o sea desde donde son visibles. Una variable definida dentro de una funcion suele ser visible solo desde esa funcion.


Supongamos la siguiente situacion:

#---Caso 1
a = 5
print a
def funcion():
print a

function()
#fin codigo

Este codigo lo que hace es imprimer 5 dos veces en la pantalla, ahora observemos otro caso
En este primer caso como la variable a esta definida fuera de la funcion es visible dentro de la funcion, pero en el caso contrario no sucede lo mismo, para eso veamos el siguiente ejemplo

#---Caso 2
def otra_funcion():
b = 5

otra_funcion()
print b
#fin codigo

En este caso obtenenmos un error puesto que la variable b fue definida dentro de una funcion y la estamos llamando desde fuera, una solucion a este problemas es declarar la variable como variable global, en ese caso la variable es visible en cualquier parte del codigo.

Solucion al caso 2:

#---Solucion al caso 2
def solucion():
global b
b = 6

solucion()
print b
#fin codigo


A modo de advertencia dejo claro que las variables globales quedan tapadas por las locales, pero este comentario probablemente no sea muy clara asi que pongamoslo un ejemplo de esto


#---codigo
a = 5
def funcion():
a = 7

funcion()
print a

La pregunta que deberias estar haciendote es: ¿que imprime?.

La respuesta es 5, y la razon es porque cuando definimos la variable a en la funcion tapamos la definida anteriormente, hay que tener cuidado con esto, este tipo de errores son muy dificiles de rastrear.

La explicacion de porque esto sucede es dificil explicarla sin dibujitos pera la idea es la siguiente, el programa principal imaginalo como un bloque que en la parte superior tiene escrita informacion, ahora cuando en el programa llama a una funcion
se pone otro bloque pero de menor tamaño, que tapa la mayor parte de lo que estaba en el bloque anterior excepto aquellas cosas que fueron escritas en la periferia, de esta manera se va construyendo una especie de piramide que realmente es mas parecida a una columna que recibe como nombre tecnico pila (stock). Espero que entienda que esto es una metafora y no es del todo correcto.

Para completar me gustaria comentarles que en python se puede conocer cuales son las variables locales que actualmente estan en uso, para acceder a ellas se usa la funcion locals(), esta devuelve un diccionario con todas las variables locales, de la misma forma es posible conocer que variables globales estan en uso a traves de la funcion globals().

No hay comentarios: