Saltar a contenido

Error de nombre en Python

Recordamos nuestro último programa:

python
# Solicitar al usuario un número entero y convertirlo a un número entero
try:
    # Solicitar al usuario un número entero
    # input siempre devuelve una cadena de caracteres.
    # Por lo tanto es necesario convertir la cadena a un número entero con la función int()
    numero = int(input("Ingrese un número entero: "))

except ValueError:
    # Si el usuario ingresa un valor que no es un número entero, se ejecutará este bloque

    # Muestra un mensaje correspondiente al error de valor    
    print("¡Ups! El valor ingresado no es un número entero.")


# Imprimir el número ingresado utilizando f-strings
print(f"El número ingresado es: {numero}")

Ejecutemos el programa y veamos qué sucede si el usuario ingresa un valor que no es un número entero:

Terminal (Entrada/Salida)
Ingrese un número entero: hola
¡Ups! El valor ingresado no es un número entero.

Traceback (most recent call last):
  File "c:\Usuarios\pablo\runtimeError.py", line 16, in <module>
    print(f"El número ingresado es: {numero}")
                                     ^^^^^^
NameError: name 'numero' is not defined

¿Qué ha ocurrido esta vez?

NameError

Como podemos observar, el programa se detiene y se genera un error de nombre o "NameError".

¿Y qué significa este error de nombre?

analicemos el mensaje de error:

Terminal (Entrada/Salida)
Traceback (most recent call last):
  File "c:\Usuarios\pablo\runtimeError.py", line 16, in <module>
    print(f"El número ingresado es: {numero}")
                                     ^^^^^^
NameError: name 'numero' is not defined

En este caso, el error se produce porque el bloque except maneja el error de valor correctamente, pero luego el programa intenta imprimir el número ingresado, que no está definido. Por lo tanto, se genera un error de nombre: NameError: name 'numero' is not defined.

Esencialmente, el error de nombre se produce cuando se intenta acceder a la variable numero que no ha sido definida previamente.

Entonces, el error de nombre o "NameError" es un tipo de error que se produce cuando se intenta acceder a una variable que no ha sido definida previamente. Y esto tiene que ver con la lógica de tu código. Como si estuvieras haciendo algo con el nombre de una variable que no deberías hacer. En este caso, accederla cuando aún no ha sido definida.

Pero, ¿nuestra variable numero no fue definida en el bloque try? ¿Por qué se produce este error?

Veamos el código nuevamente, ya sin los comentarios para agilizar la lectura:

python
1
2
3
4
5
6
7
try:
    numero = int(input("Ingrese un número entero: "))

except ValueError:
    print("¡Ups! El valor ingresado no es un número entero.")

print(f"El número ingresado es: {numero}")

Hasta no hace mucho, cuanto la línea 7 se encontraba debajo de la línea 2, dentro del bloque try, nuestro programa funcionaba perfectamente.

¿Es un problema de alcance? ¿Recuerdas que es el alcance?

El alcance se refiere a la parte del código en la que existe una variable. Tenemos variables locales, que existen dentro de funciones o bloques de código, por ejemplo; y tenemos variables globales, que existen en todo el programa.

En lenguajes como C, C++ y Java, donde la indentación1 o el uso de llaves llaves tienden a definir el alcance de una variable, este podría ser el problema: la variable numero al ser definida en la línea 2, dentro del bloque try sería local de ese bloque y no existiría por fuera de el, en la línea 7.

Pero esta teoría de alcance no es válida en Python. En Python, las variables definidas dentro de un bloque try son accesibles fuera de él.

Entonces, ¿cuál es el problema? Piensa por un momento y luego avancemos al siguiente tema.

Referencias:


  1. Indentación: Si quieres repasar este concepto, puedes hacerlo en la unidad de funciones y subrutinas haciendo clic aquí