1 usuario conectado

Funciones. Ámbito de las variables en Python. Global vs Local

Comparte esto

Ahora vamos a explorar el ámbito de las variables (scope) en Python, un concepto fundamental para entender cómo y dónde se pueden acceder a las variables dentro de tu código. El ámbito de una variable determina la región del código donde esa variable es visible y puede ser utilizada.

En Python, existen principalmente dos ámbitos principales:

  1. Ámbito Global: Las variables que se definen fuera de cualquier función o bloque de código (al nivel superior de un módulo) tienen un ámbito global. Esto significa que pueden ser accedidas desde cualquier parte del programa, incluyendo dentro de las funciones.

  2. Ámbito Local (o Función): Las variables que se definen dentro de una función tienen un ámbito local. Esto significa que solo son accesibles dentro de esa función donde fueron definidas. No se pueden acceder directamente desde fuera de la función.

Ejemplo para ilustrar el ámbito global y local:
 

Python
 
variable_global = "Soy una variable global"

def mi_funcion():
    variable_local = "Soy una variable local"
    print("Dentro de la función:")
    print(variable_global)  # Acceso a la variable global
    print(variable_local)   # Acceso a la variable local

mi_funcion()

print("\nFuera de la función:")
print(variable_global)  # Acceso a la variable global
# print(variable_local)   # Esto generaría un NameError: name 'variable_local' is not defined

Salida:

Dentro de la función:
Soy una variable global
Soy una variable local

Fuera de la función:
Soy una variable global

Como vemos, variable_global se puede acceder tanto dentro como fuera de mi_funcion(). Sin embargo, variable_local solo es accesible dentro de la función donde fue definida. Intentar acceder a ella fuera de la función resulta en un NameError.

Preferencia del Ámbito Local:

Cuando una variable con el mismo nombre se define tanto en el ámbito local como en el global, la variable local oculta a la variable global dentro de la función. Es decir, cuando se hace referencia al nombre de la variable dentro de la función, Python primero busca en el ámbito local. Si la encuentra, la utiliza; de lo contrario, busca en el ámbito global.

Python
 
variable_global = 10

def otra_funcion():
    variable_local = 5
    print("Dentro de otra_funcion:", variable_local)  # Imprime la variable local

otra_funcion()
print("Fuera de otra_funcion:", variable_global)  # Imprime la variable global

def funcion_con_misma_nombre():
    variable_global = 20  # ¡Esto CREA una NUEVA variable LOCAL con el mismo nombre!
    print("Dentro de funcion_con_misma_nombre:", variable_global)

funcion_con_misma_nombre()
print("Después de funcion_con_misma_nombre:", variable_global)

Salida:

Dentro de otra_funcion: 5
Fuera de otra_funcion: 10
Dentro de funcion_con_misma_nombre: 20
Después de funcion_con_misma_nombre: 10

Observa que en funcion_con_misma_nombre(), la asignación variable_global = 20 crea una nueva variable local dentro de la función. No modifica la variable global definida fuera de la función.

La Palabra Clave global:

Si realmente necesitas modificar una variable global dentro de una función, puedes utilizar la palabra clave global antes del nombre de la variable dentro de la función. Esto le dice a Python que la variable a la que te refieres es la variable global, no una nueva variable local.
 

Python
 
contador_global = 0

def incrementar_contador():
    global contador_global  # Indica que estamos usando la variable global
    contador_global += 1
    print("Contador dentro de la función:", contador_global)

incrementar_contador()
incrementar_contador()

print("Contador fuera de la función:", contador_global)

Salida:

Contador dentro de la función: 1
Contador dentro de la función: 2
Contador fuera de la función: 2

Al usar global contador_global, las operaciones dentro de la función modifican directamente la variable contador_global definida en el ámbito global.

La Palabra Clave nonlocal:

Existe otra palabra clave, nonlocal, que se utiliza en el contexto de funciones anidadas (funciones definidas dentro de otras funciones). Permite acceder y modificar variables del ámbito léxico superior más cercano que no sea el ámbito global.
 

Python
def funcion_externa():
    variable_externa = "Soy de la función externa"

    def funcion_interna():
        nonlocal variable_externa  # Accede a la variable de la función externa
        variable_externa = "He sido modificada por la función interna"
        print("Dentro de la función interna:", variable_externa)

    funcion_interna()
    print("Dentro de la función externa (después de la llamada interna):", variable_externa)

funcion_externa()

Salida:

Dentro de la función interna: He sido modificada por la función interna
Dentro de la función externa (después de la llamada interna): He sido modificada por la función interna

Aquí, nonlocal variable_externa en funcion_interna() permite modificar la variable variable_externa definida en el ámbito de funcion_externa().

En resumen:

Comprender el ámbito de las variables es crucial para evitar errores y escribir código más limpio y predecible.