CodeGym /Cursos /Python SELF ES /Ámbitos de visibilidad de las variables

Ámbitos de visibilidad de las variables

Python SELF ES
Nivel 6, Lección 4
Disponible

10.1 Variables locales de función

En Python una variable está disponible (se puede referenciar) desde el momento de su creación hasta el final de su ámbito de visibilidad — la mayoría de las veces es la función en la que se declara. Si una variable se declara fuera de todas las funciones, se le llama global.

En Python, los ámbitos de visibilidad de las variables determinan el contexto en el cual las variables están disponibles para su uso. Los ámbitos de visibilidad ayudan a evitar conflictos de nombres y a controlar el acceso a los datos. Los principales tipos de ámbitos de visibilidad en Python incluyen:

Ámbito de visibilidad local: Las variables creadas dentro de una función existen en el ámbito de visibilidad local de esa función y sólo son accesibles dentro de ella.

Ámbito de visibilidad de funciones anidadas: Si una función se define dentro de otra función, sus variables sólo están disponibles dentro de esa función anidada.

Ámbito de visibilidad global: Las variables definidas a nivel de script o módulo se consideran globales y están disponibles desde cualquier parte del código en el mismo módulo.

Ámbito de visibilidad incorporado: Es un ámbito especial que incluye todos los objetos y funciones incorporados de Python que están disponibles por defecto (por ejemplo, print() y len()).

Regla LEGB

Para la resolución de variables, Python utiliza la regla LEGB, que determina el orden en el cual el intérprete busca las variables:

  • L (Local) — Primero busca en el ámbito de visibilidad local.
  • E (Enclosed) — Luego en los ámbitos de todas las funciones anidadas, desde la más cercana a la más externa.
  • G (Global) — A continuación en el ámbito de visibilidad global.
  • B (Built-in) — Finalmente en el ámbito de visibilidad incorporado.

Ejemplos de uso


x = "global"  # Variable global

def outer():
    y = "outer local"  # Variable local de la función externa
    def inner():
        z = "inner local"  # Variable local de la función anidada
        print(x)  # Muestra "global"
        print(y)  # Muestra "outer local"
        print(z)  # Muestra "inner local"
    inner()

outer()

La variable z sólo está disponible dentro de la función inner().

La variable y está disponible dentro de la función outer() y en todas las funciones que se declaren dentro de ella.

La variable x está disponible en todo el archivo actual (módulo).

10.2 Acceso a variables globales: global x

Una característica interesante de Python es que las variables de ámbitos externos (en los cuales está anidado el ámbito actual) sólo se pueden leer.

Al intentar escribir algo en una variable externa, se creará una variable local con el mismo nombre y se perderá el acceso a la variable externa.

Ejemplo:


x = 10

def change_global():
    print(x)  # Esto generará un error, ya que x se considerará una variable local después de la asignación
    x = 20  # Aquí se crea una variable local x
    print(x)  # Muestra 20 (se refiere a la variable local x)
        
change_global()
print(x)  # Muestra 10

Este ejemplo no funciona y generará un error UnboundLocalError, porque el intérprete de Python primero ve la asignación x = 20 y considera que x es una variable local. Sin embargo, cuando el intérprete llega a la línea print(x), no encuentra la variable local x, ya que aún no ha sido definida.

Esto se hace por seguridad, para que las variables locales no cambien accidentalmente las globales.

El operador global

Si necesitas cambiar conscientemente el valor de una variable global dentro de una función, puedes utilizar el operador global. Este operador permite especificar explícitamente que el cambio debe hacerse en la variable global y no en la local.

Para cambiar el valor de una variable global dentro de una función, es necesario declarar esa variable al inicio de la función con global. Esto le da acceso a la función para escribir en la variable:


x = 10

def change_global():
    global x  # Declaramos x como variable global
    print(x)  # Muestra 10 (se refiere a la variable global x)
    x = 20  # Aquí asignamos un nuevo valor a la variable global x
    print(x)  # Muestra 20 (se refiere a la variable global x)

change_global()
print(x)  # Muestra 20

El uso del operador global permite evitar el error y gestionar correctamente las variables globales.

Las variables globales pueden hacer que el programa sea menos predecible y más difícil de entender, ya que sus valores pueden ser cambiados en cualquier lugar del programa. Esto es especialmente crítico si el programa es grande y está siendo desarrollado por un equipo de programadores.

Aunque a veces el uso de variables globales es inevitable, es mejor intentar minimizar su aplicación. En lugar de variables globales, considera la posibilidad de utilizar parámetros de función, valores de retorno y clases para almacenar el estado.

El uso de variables globales puede causar efectos secundarios inesperados, dificultar la depuración y prueba del código, y reducir su reutilización. Por lo tanto, se recomienda usar variables globales con precaución y solo cuando sea realmente necesario.

10.3 Acceso a variables no-locales: nonlocal

Además de las variables globales y locales, en Python existen variables de ámbitos intermedios. Por ejemplo, cuando una función está anidada dentro de otra función. Para trabajar con estas variables se utiliza el operador nonlocal.

El operador nonlocal permite trabajar con variables en funciones anidadas, modificando sus valores en el ámbito de visibilidad más cercano, excluyendo las variables globales.

El operador nonlocal ayuda a evitar la creación de una nueva variable local en una función anidada cuando es necesario modificar una variable definida en la función externa. Sin el uso de nonlocal los cambios sólo afectarían a la variable local de la función interna, sin influir en la variable de la función externa.

Ejemplo:


def outer():
    count = 0

    def inner():
        nonlocal count
        count += 1
        return count

    return inner

counter = outer()
print(counter())  # Muestra 1

Aquí tienes un ejemplo más práctico del uso de nonlocal para crear un contador:


def create_counter():
    count = 0
    
    def increment():
        nonlocal count
        count += 1
        return count
    
    return increment

counter = create_counter()
print(counter())  # Muestra 1
print(counter())  # Muestra 2
print(counter())  # Muestra 3

Este ejemplo demuestra cómo nonlocal puede ser utilizado en escenarios reales para crear una función que conserve su estado entre llamadas.

2
Tarea
Python SELF ES, nivel 6, lección 4
Bloqueada
Uso de una variable global
Uso de una variable global
2
Tarea
Python SELF ES, nivel 6, lección 4
Bloqueada
Uso de la variable nonlocal
Uso de la variable nonlocal
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION