Variables locales y globales en Python

V

Uno de los elementos básicos de los lenguajes de programación son las variables. Hablando simplemente, una variable es una capa de abstracción para las celdas de memoria que contienen el valor real. Para nosotros, como desarrolladores, es más fácil recordar el nombre de la celda de memoria que recordar su dirección de memoria física. Un nombre válido puede constar de caracteres de la ‘a’ a la ‘z’ (en mayúsculas y minúsculas), así como de dígitos. No se permiten espacios ni caracteres especiales, como diéresis y guiones, en el nombre.

Además, las variables tienen un tipo de datos específico como cadenas (caracteres), dígitos, listas o referencias a otras variables. En Python, podemos reutilizar la misma variable para almacenar valores de cualquier tipo. El tipo se determina automáticamente por el valor que se asigna al nombre. Para definir una variable con un valor específico, simplemente asigne este valor a un nombre de la siguiente manera:

age = 42
name = "Dominic"
places = ["Berlin", "Cape Town", "New York"]

El intérprete de Python crea las tres variables age, namey places, y asigna el valor 42 a la primera y “Dominic” a la segunda variable, y places se convierte en una lista de tres elementos que contiene las cadenas “Berlín”, “Ciudad del Cabo” y “Nueva York”.

Espacios de nombres

Todas las variables de arriba son parte del mismo espacio de nombres y por lo tanto tienen el mismo alcance. A menos que se redefina como variable local más adelante, una variable definida en el programa principal pertenece al espacio de nombres global, al que se puede acceder mediante cualquier función en su programa Python. El siguiente código de ejemplo demuestra eso y usa las dos variables name y age en la función info().

age = 42
name = "Dominic"
places = ["Berlin", "Cape Town", "New York"]

def info():
    print("%s is %i years old." % (name, age))
    return

info()

La salida consta de una sola línea que proviene del print declaración en función info():

$ python3 global.py
Dominic is 42 years old.

Para ser más precisos, cada módulo, clase y función tiene su propio espacio de nombres y las variables están vinculadas localmente a eso. En el siguiente ejemplo, usamos dos espacios de nombres: el externo, global del programa principal y el interno, local de la función simplemente nombrada output(). La variable place existe en el programa principal (línea 6) y se redefine como una variable local con un nuevo valor en la línea 2 de la función output().

def output():
   place = "Cape Town"
   print("%s lives in %s." % (name, place))
   return

place = "Berlin"
name = "Dominic"
print("%s lives in %s." % (name, place))
output()

La salida consta de estas dos líneas, mientras que la primera línea se origina en el programa principal (línea 8) y la segunda línea en el print declaración en la línea 3 en la función output(). Al principio las dos variables name y place se definen en el programa principal (líneas 6 y 7) y se imprimen en stdout. Llamando al output() función, la variable place se redefine localmente en la línea 2 y name proviene del espacio de nombres global. Esto conduce a la salida como se muestra a continuación.

$ python3 localscope.py
Dominic lives in Berlin.
Dominic lives in Cape Town.

Modificar variables globales en un espacio de nombres diferente

Se puede acceder al valor de una variable global a lo largo de todo el programa. Para lograr eso desde dentro de las funciones, Python ofrece el uso de la palabra clave global. La función a continuación demuestra cómo usarla e importa la variable name en el espacio de nombres de la función:

def location():
    global place
    place = "Cape Town"
    return

place = "Berlin"
print(place)
location()
print(place)

La variable place ya está definido en el programa principal (línea 6). Usando la palabra clave global en la línea 2, la variable pasa a estar disponible en la función location() y se puede establecer en un valor diferente, inmediatamente (línea 3). La salida del código se muestra aquí:

$ python3 globalscope.py
Berlin
Cape Town

Sin usar la palabra clave global como se ve en la línea 2, la variable place se trataría como una variable local en la función location() en su lugar y la variable place del programa principal no se modifica.

Detectar el alcance de una variable

Python tiene dos métodos incorporados llamados globals() y locals(). Le permiten determinar si una variable es parte del espacio de nombres global o del espacio de nombres local. El siguiente ejemplo muestra cómo utilizar estos métodos:

def calculation():
    "do a complex calculation"
    
    global place
    place = "Cape Town"
    name = "John"
    
    print("place in global:", 'place' in globals())
    print("place in local :", 'place' in locals())
    print("name in global :", 'name' in globals())
    print("name in local  :", 'name' in locals())
    return

place = "Berlin"
print(place)
calculation()

El resultado es el siguiente y muestra el alcance de las dos variables place y name dentro de la función calculation():

$ python3 variablelist.py
Berlin
place in global: True
place in local : False
name in global : False
name in local  : True

Usar variables globales en la práctica

Usar y modificar variables globales desde funciones internas se considera un estilo de programación muy malo, ya que provoca efectos secundarios, que son bastante difíciles de detectar. En su lugar, se recomienda encarecidamente utilizar los parámetros de función adecuados.

Enlaces y referencias

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad