En muchos recursos encontré que "alcance" y "espacios de nombres" se usan indistintamente, lo que parece un poco confuso ya que significan cosas diferentes.
- Ámbito define la región del código donde está disponible un nombre.
- La regla LEGB define la forma en que se buscan los nombres.
- El espacio de nombres es un lugar donde buscar nombres.
Entonces leí:
- "los nombres están vinculados a un espacio de nombres de acuerdo con el lugar al que están asignados ..." (que creo que es el trato con los ámbitos en el ámbito léxico)
- "las funciones agregan una capa de espacio de nombres adicional a sus programas" [ ref. ] (¿no agregan un alcance local adicional?)
- "todos los nombres asignados dentro de una definición de función se colocan en el ámbito local (el espacio de nombres asociado con la llamada a la función)".
- "alcance global, es decir, un espacio de nombres en el que viven las variables creadas (asignadas) en el nivel superior del archivo del módulo".
* todas las citas son del aprendizaje de python 5th edition ch17
¿Son los espacios de nombres en Python la forma en que se implementan los ámbitos? ¿Son la misma cosa? ¿Alguien puede iluminarme?
Respuestas:
Un espacio de nombres es un diccionario que asigna nombres (como cadenas) a valores. Cuando haces una tarea, como
a = 1
, estás mutando un espacio de nombres. Cuando hace una referencia, por ejemploprint(a)
, Python mira a través de una lista de espacios de nombres para tratar de encontrar uno con el nombre como clave.Un ámbito define en qué espacios de nombres se buscará y en qué orden. El alcance de cualquier referencia siempre comienza en el espacio de nombres local y se mueve hacia afuera hasta que alcanza el espacio de nombres global del módulo, antes de pasar a
builtins
(el espacio de nombres que hace referencia a las funciones y constantes predefinidas de Python, comorange
ygetattr
), que es el final de la línea .Imagine que tiene una función llamada
inner
, anidada dentro de una función global llamadaouter
yinner
contiene una referencia a un nombre. Python primero busca en elinner
espacio de nombres. Si el nombre no está allí, Python busca en elouter
espacio de nombres. Si eso falla, Python prueba elglobal
espacio de nombres del módulo , luego elbuiltin
espacio de nombres, y finalmente arroja unNameError
si no se encuentra el nombre.Cuando decimos que
x
está en el espacio de nombres de una función, queremos decir que está definido allí, localmente dentro de la función. Cuando decimos quex
está en el alcance de la función, queremos decir quex
está en el espacio de nombres de la función o en cualquiera de los espacios de nombres externos en los que está anidado el espacio de nombres de la función.Cada vez que define una función, crea un nuevo espacio de nombres y un nuevo ámbito. El espacio de nombres es el nuevo hash local de nombres. El ámbito es la cadena implícita de espacios de nombres que comienza en el nuevo espacio de nombres, luego se abre paso a través de los espacios de nombres externos (ámbitos externos), hasta el espacio de nombres global (el ámbito global) y hasta los espacios integrados.
Los términos se pueden usar casi indistintamente, pero eso no se debe a que significan lo mismo; es porque se superponen mucho en lo que implican.
fuente
Hay un excelente artículo sobre espacios de nombres de Python aquí . Para citar la parte relevante para responder a su pregunta sobre la referencia entre ámbitos y espacios de nombres:
Por ejemplo, imagine un programa simple de lanzamiento de dados:
roll
tiene su propio espacio de nombres , pero los nombres en el espacio de nombres del módulo también están dentro del alcance .fuente