Un Namespace no tiene una traducci贸n demasiado elegante en espa帽ol, pero tal vez la m谩s literal sea espacio de nombres. Un espacio de nombres es un sistema donde cada objeto (variable, funci贸n, etc.) tiene un nombre 煤nico.Cuando hablamos de namespaces, solemos encontrar una analog铆a usual para explicarlos: piensa por ejemplo en archivos en la PC. Si estamos dentro de un directorio particular, no podemos tener m谩s de un archivo llam谩ndose igual. Entonces, los nombres de los archivos dentro de ese directorio act煤an como un Namespace, ya que cada nombre de archivo es 煤nico. Sin embargo, esto no quiere decir que un nombre no pueda repetirse en otros directorios, y si bien dicho nombre se comparte, los archivos se diferencian porque se encuentran en diferentes directorios. Nuevamente, el nombre de los directorios es un Namespace porque cada directorio es 煤nico. Pero, otra vez, la combinaci贸n directorio y nombre de archivo debe ser 煤nica, sino no sabr铆amos c贸mo diferenciar un archivo de otro.
Lo anterior tiene implicancias importantes a la hora de programar: una variable llamada, por ejemplo, mi_numero definida en el programa no podr谩 existir con dos valores diferentes:
mi_numero = 5
mi_numero = 10
print(mi_numero)
En dicha ejecuci贸n, cada objeto tiene un nombre 煤nico, por lo que dos objetos con el mismo nombre, ser谩n en realidad el mismo, y mi_numero almacenar谩 煤nicamente el valor 10 en lugar de 5. Sin embargo, ¿qu茅 ocurrir铆a en el siguiente caso?:
mi_numero = 5
def cambia_numero():
mi_numero = 10
cambia_numero()
print(mi_numero)
La funci贸n print() final imprimir谩 5, y no 10. ¿Coincide esto con lo que esperabas? Lo que ha ocurrido, es que la funci贸n cambia_numero() ha creado un espacio de nombres local cuando la hemos invocado, y el mismo se ha destruido cuando termina el llamado. Con lo cual tenemos que en realidad la funci贸n cambia_numero en realidad no hace nada: no tiene efecto alguno en nuestro c贸digo. Conocer y dominar este comportamiento te ayudar谩 a predecir la forma en la que se comportar谩n tus variables, evitando resultados inesperados.
Otra conclusi贸n derivada de lo anterior, es que si tuvi茅ramos un c贸digo similar al anterior, pero con ligeras modificaciones:
mi_numero = 5
def cambia_numero():
numero = 10
cambia_numero()
print(numero)
La variable numero es inaccesible desde el exterior de la funci贸n, ya que es un espacio de nombres local, y dicho nombre no existe en un 谩mbito m谩s general del programa.
Hemos mencionado el espacio de nombres local (aquel que tiene una vida limitada a la ejecuci贸n de la funci贸n): ese es un ejemplo de espacio de nombres, pero hay otros. Una forma de representarlos es como sigue:
Los namespaces incorporados, son aquellos que pertenecen a Python en s铆, y se inician desde el mismo momento que inicia el int茅rprete de Python. Son todas las palabras clave, tipos de datos, excepciones y funciones propias como print() e input().
Un namespace global, se genera al importar un m贸dulo, o al definir variables o funciones al nivel del programa principal. Cada m贸dulo, a su vez, crea su propio espacio de nombres. Se van creando conforme el programa se ejecuta, y son destruidos una vez que finaliza esta ejecuci贸n.
Dos conceptos que han ido apareciendo, sin que los mencionemos expl铆citamente, son lifetime, y scope. Para que no te agarren deprevenido/a la pr贸xima vez que leas al respecto, lifetime refiere al momento durante el cual existen los espacios de nombre (y cu谩ndo dejan de existir), mientras que scope se refiere al alcance, o d贸nde podemos accederlos.