Saltar a contenido

Alcance de las funciones definidas por el usuario

Se conoce como alcance (scope en inglés) de una función a la región del programa en la que una función definida por el usuario puede ser invocada. En Python, las funciones definidas por el usuario tienen un alcance local, lo que significa que solo pueden ser invocadas dentro del ámbito en el que fueron definidas. Esto implica que las funciones definidas por el usuario no pueden ser invocadas desde fuera de su ámbito de definición, a menos que sean importadas o llamadas desde otro ámbito.

Este mismo concepto se aplica para las variables definidas dentro de una función. Estas tienen un alcance local y solo pueden ser accedidas desde dentro de la función en la que fueron definidas. Si se intenta acceder a una variable definida dentro de una función desde fuera de esta, se generará un error de tipo NameError indicando que la variable no está definida.

Analicemos el siguiente ejemplo para ilustrar el alcance de las funciones definidas por el usuario en Python:

Python
# Definición de la función principal del programa
def main():
    nombre = input("¿Cuál es tu nombre? ")
    print(formatear_saludo())

# Definiciones de funciones de usuario
def formatear_saludo():
    return f"Hola, {nombre}!"

# Llamada a la función principal
main()

Aquí la función definida formatear_saludo() no posee ningún parámetro indicado. Y por consiguiente, cada vez que sea llamada, no se pasará ningún argumento.

Cuando se intente acceder, dentro de la función formatear_saludo(), a la variable nombre que fue definida en la función main(), se generará un error de tipo NameError ya que la variable nombre no está definida en el ámbito de la función formatear_saludo(). Solo existe y es accesible en el ámbito de la función main().

Por lo tanto, si ejecutamos el código anterior, obtendremos un error de tipo NameError en la línea 7, ya que la variable nombre no está definida en el ámbito de la función formatear_saludo().

Esto se debe a que la variable nombre fue definida en el ámbito de la función main() y no puede ser accedida desde la función formatear_saludo().

Aquí está la salida que obtendríamos al ejecutar el código anterior:

Terminal (Entrada/Salida)
¿Cuál es tu nombre? Pablo
Traceback (most recent call last):
  File "c:\Users\usuario\hola_mundo.py", line 11, in <module>
    main()
  File "c:\Users\usuario\hola_mundo.py", line 4, in main
    print(formatear_saludo())
          ^^^^^^^^^^^^^^^^^^
  File "c:\Users\usuario\hola_mundo.py", line 8, in formatear_saludo
    return f"Hola, {nombre}!"
                    ^^^^^^
NameError: name 'nombre' is not defined

Así es como podemos observar el concepto de alcance, que se refiere a una variable que solo existe en el contexto en el que es definida.

Como nombre es definida dentro de función main(), solo existe y puede se accedida en dicha función.

Para solucionar este problema, podemos pasar la variable nombre como argumento a la función formatear_saludo(), tal como lo veníamos haciendo durante los temas vistos con anterioridad.

De esta manera, la función formatear_saludo() podrá acceder a la variable nombre que le es pasada como argumento.

Python
# Definición de la función principal del programa
def main():
    nombre = input("¿Cuál es tu nombre? ")
    print(formatear_saludo(nombre))

# Definiciones de funciones de usuario
def formatear_saludo(nombre):
    return f"Hola, {nombre}!"

# Llamada a la función principal
main()

Ahora, si ejecutamos el código anterior, obtendremos la salida esperada:

Terminal (Entrada/Salida)
¿Cuál es tu nombre? Pablo
Hola, Pablo!

En resumen, el alcance de las funciones definidas por el usuario en Python es local, lo que significa que solo pueden ser invocadas dentro del ámbito en el que fueron definidas. Si se intenta acceder a una variable definida dentro de una función desde fuera de esta, se generará un error de tipo NameError indicando que la variable no está definida. Para solucionar este problema, se pueden pasar las variables necesarias como argumentos a las funciones que las requieran.