Espacio de nombres de Python y alcance de una variable

En este tutorial, aprenderá sobre el espacio de nombres, la asignación de nombres a objetos y el alcance de una variable.

¿Qué es el nombre en Python?

Si alguna vez ha leído 'El Zen de Python' (escriba import thisel intérprete de Python), la última línea dice, Los espacios de nombres son una gran idea, ¡hagamos más de eso! Entonces, ¿qué son estos misteriosos espacios de nombres? Veamos primero qué nombre es.

Nombre (también llamado identificador) es simplemente un nombre dado a los objetos. Todo en Python es un objeto. El nombre es una forma de acceder al objeto subyacente.

Por ejemplo, cuando hacemos la asignación a = 2, 2hay un objeto almacenado en la memoria y a es el nombre con el que lo asociamos. Podemos obtener la dirección (en RAM) de algún objeto a través de la función incorporada id(). Veamos cómo se usa.

 # Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))

Salida

 id (2) = 9302208 id (a) = 9302208

Aquí, ambos se refieren al mismo objeto 2, por lo que tienen el mismo id(). Hagamos las cosas un poco más interesantes.

 # Note: You may get different values for the id a = 2 print('id(a) =', id(a)) a = a+1 print('id(a) =', id(a)) print('id(3) =', id(3)) b = 2 print('id(b) =', id(b)) print('id(2) =', id(2))

Salida

 id (a) = 9302208 id (a) = 9302240 id (3) = 9302240 id (b) = 9302208 id (2) = 9302208

¿Qué sucede en la secuencia de pasos anterior? Usemos un diagrama para explicar esto:

Diagrama de memoria de variables en Python

Inicialmente, 2se crea un objeto y se le asocia el nombre a, cuando lo hacemos a = a+1, 3se crea un nuevo objeto y ahora se asocia a a este objeto.

Tenga en cuenta eso id(a)y id(3)tenga los mismos valores.

Además, cuando b = 2se ejecuta, el nuevo nombre b se asocia con el objeto anterior 2.

Esto es eficaz ya que Python no tiene que crear un nuevo objeto duplicado. Esta naturaleza dinámica del enlace de nombres hace que Python sea poderoso; un nombre puede referirse a cualquier tipo de objeto.

 >>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)

Todos estos son válidos y se referirá a tres tipos diferentes de objetos en diferentes instancias. Las funciones también son objetos, por lo que un nombre también puede hacer referencia a ellas.

 def printHello(): print("Hello") a = printHello a()

Salida

 Hola

El mismo nombre a puede referirse a una función y podemos llamar a la función usando este nombre.

¿Qué es un espacio de nombres en Python?

Ahora que entendemos qué son los nombres, podemos pasar al concepto de espacios de nombres.

En pocas palabras, un espacio de nombres es una colección de nombres.

En Python, puede imaginar un espacio de nombres como una asignación de cada nombre que ha definido a los objetos correspondientes.

Diferentes espacios de nombres pueden coexistir en un momento dado, pero están completamente aislados.

Un espacio de nombres que contiene todos los nombres integrados se crea cuando iniciamos el intérprete de Python y existe mientras se ejecuta el intérprete.

Esta es la razón por la que las funciones integradas como id(), print()etc. siempre están disponibles para nosotros desde cualquier parte del programa. Cada módulo crea su propio espacio de nombres global.

Estos diferentes espacios de nombres están aislados. Por lo tanto, el mismo nombre que puede existir en diferentes módulos no choca.

Los módulos pueden tener varias funciones y clases. Se crea un espacio de nombres local cuando se llama a una función, que tiene todos los nombres definidos en él. Similar es el caso de la clase. El siguiente diagrama puede ayudar a aclarar este concepto.

Un diagrama de diferentes espacios de nombres en Python

Alcance variable de Python

Aunque hay varios espacios de nombres únicos definidos, es posible que no podamos acceder a todos ellos desde todas las partes del programa. Entra en juego el concepto de alcance.

Un alcance es la parte de un programa desde donde se puede acceder a un espacio de nombres directamente sin ningún prefijo.

En un momento dado, hay al menos tres ámbitos anidados.

  1. Alcance de la función actual que tiene nombres locales
  2. Alcance del módulo que tiene nombres globales
  3. Alcance más externo que tiene nombres integrados

Cuando se hace una referencia dentro de una función, el nombre se busca en el espacio de nombres local, luego en el espacio de nombres global y finalmente en el espacio de nombres integrado.

Si hay una función dentro de otra función, se anida un nuevo ámbito dentro del ámbito local.

Ejemplo de ámbito y espacio de nombres en Python

 def outer_function(): b = 20 def inner_func(): c = 30 a = 10

Here, the variable a is in the global namespace. Variable b is in the local namespace of outer_function() and c is in the nested local namespace of inner_function().

When we are in inner_function(), c is local to us, b is nonlocal and a is global. We can read as well as assign new values to c but can only read b and a from inner_function().

If we try to assign as a value to b, a new variable b is created in the local namespace which is different than the nonlocal b. The same thing happens when we assign a value to a.

However, if we declare a as global, all the reference and assignment go to the global a. Similarly, if we want to rebind the variable b, it must be declared as nonlocal. The following example will further clarify this.

 def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

As you can see, the output of this program is

 a = 30 a = 20 a = 10

En este programa, se definen tres variables diferentes a en espacios de nombres separados y se accede a ellas en consecuencia. Mientras esté en el siguiente programa,

 def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

La salida del programa es.

 a = 30 a = 30 a = 30 

Aquí, todas las referencias y asignaciones son a la global debido al uso de palabras clave global.

Articulos interesantes...