Variables locales y globales en Python

Uno de los elementos básicos de los lenguajes de programación son las variables. Simplemente hablando, una variable es una capa de abstracción para las celdas de memoria que contienen el real...

Uno de los elementos básicos de los lenguajes de programación son las variables. Simplemente hablando, 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 'a' a 'z' (tanto en mayúsculas como en minúsculas), así como en 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:

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

El intérprete de Python crea las tres variables edad, nombre y lugares, y asigna el valor 42 a la primera y "Dominic" a la segunda variable, y lugares 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 una 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 de Python. El siguiente código de ejemplo demuestra eso y usa las dos variables name y age en la función info().

1
2
3
4
5
6
7
8
9
age = 42
name = "Dominic"
places = ["Berlin", "Cape Town", "New York"]

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

info()

La salida consiste en una sola línea que proviene de la sentencia print en la función info():

1
2
$ 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 él. En el siguiente ejemplo, hacemos uso de dos espacios de nombres: el externo global del programa principal y el interno local de la función simplemente llamada 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().

1
2
3
4
5
6
7
8
9
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 consiste en 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 la instrucción print en la línea 3 en la función output(). Al principio, las dos variables ’nombre’ y ’lugar’ se definen en el programa principal (líneas 6 y 7) y se imprimen en la salida estándar. Al llamar a la función output(), la variable place se redefine localmente en la línea 2 y name proviene del espacio de nombres global, en su lugar. Esto conduce a la salida como se muestra a continuación.

1
2
3
$ python3 localscope.py
Dominic lives in Berlin.
Dominic lives in Cape Town.

Modificación de variables globales en un espacio de nombres diferente {#modificación de 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 siguiente función demuestra cómo usarla e importa la variable name al espacio de nombres de la función:

1
2
3
4
5
6
7
8
9
def location():
    global place
    place = "Cape Town"
    return

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

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

1
2
3
$ python3 globalscope.py
Berlin
Cape Town

Sin usar la palabra clave “global” como se ve en la línea 2, la variable “lugar” se trataría como una variable local en la función “ubicación()” y la variable “lugar” del programa principal permanece sin cambios.

Detectar el alcance de una variable

Python tiene dos métodos integrados 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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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 lugar y nombre dentro de la función cálculo():

1
2
3
4
5
6
$ python3 variablelist.py
Berlin
place in global: True
place in local : False
name in global : False
name in local  : True

Uso de variables globales en la práctica {#uso de 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 parámetros de función adecuados.

Agradecimientos

El autor quisiera agradecer a Mandy Neumeyer por su apoyo mientras preparaba el artículo.

Enlaces y referencias

Licensed under CC BY-NC-SA 4.0