English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Herramientas en línea

Tutorial Básica de Python

Funciones en Python

Tipos de datos en Python

Control de flujo de Python

O

Objetos y Clases de Python

Fecha y Hora de Python

Conocimientos Avanzados de Python

Espacio de nombres y ámbito en Python

Manual de Referencia de Python

¿Qué es un espacio de nombres en Python? En este artículo, aprenderás sobre los espacios de nombres, desde el mapeo de nombres a objetos hasta el ámbito de las variables.

Si alguna vez has leído 'El Zen de Python' (introduce import this en el intérprete de Python), la última línea menciona que,Un espacio de nombres es una gran idea-¡Vamos a hacer más cosas!¿Qué son estos espacios de nombres misteriosos? Primero, veamos qué es un nombre.

El nombre (también conocido como identificador) es simplemente el nombre asignado al objeto. En Python, todo esObjeto. El nombre es una forma de acceder al objeto base.

Por ejemplo, cuando realizamos una operación de asignación, a = 2,2es un objeto almacenado en la memoria, mientras queaes el nombre asociado. Podemos acceder aFunciones integradas Obtener la dirección de ciertos objetos (en RAM) mediante id(). Vamos a ver cómo se usa.

# Atención: Es posible que obtengas diferentes valores de id
a = 2
print('id(2) =', id(2))
print('id(a) =', id(a))

Resultado de salida

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

Aquí, ambos hacen referencia al mismo objeto2por lo que tienen el mismo id(). Vamos a hacer algo divertido.

# Atención: Es posible que obtengas diferentes valores de 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))

Resultado de salida

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

¿Qué ocurre en la secuencia de pasos anteriores? Vamos a explicar con un gráfico:

Diagrama de memoria de variables en Python

Inicialmente, se crea un objeto2Y se asocia con el nombre a, cuando ejecutamos a = a + 1Cuando, se crea un nuevo objeto3,ahora a se asocia con ese objeto.

Note que id(a) y id(3) tiene el mismo valor.

Además, al ejecutar b = 2Cuando, el nuevo nombre b se asocia con el objeto anterior2Asociados.

Esto es válido porque Python no necesita crear un nuevo objeto repetido. Esta característica dinámica de la vinculación de nombres hace que Python sea poderoso. Los nombres pueden referirse a cualquier tipo de objeto.

>>> a = 5
>>> a = 'Hello World!'
>>> a = [1,2,3]

Todo esto es válido yaSe referirá a tres tipos diferentes de objetos en diferentes ejemplos. Todos estos son válidos yFunciónTambién son objetos, por lo que los nombres también pueden referirse a ellos.

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

Resultado de salida

Hello

Nombres idénticosaSe puede referir a una función y se puede usar ese nombre para llamar a la función.

¿Qué es un espacio de nombres en Python?

Ahora que hemos entendido qué es un nombre, podemos continuar con el concepto de espacio de nombres.

En resumen, el espacio de nombres es una colección de nombres.

En Python, puede imaginar el espacio de nombres como un mapeo de cada nombre a su objeto correspondiente.

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

Cuando iniciamos el intérprete de Python, se crea un espacio de nombres que contiene todos los nombres integrados, y mientras ese intérprete esté ejecutándose, ese espacio de nombres existirá.

Es por eso que las funciones integradas (como id()) y print() siempre se pueden usar desde cualquier parte del programa. CadaMóduloCrear su propio espacio de nombres global.

Estos diferentes espacios de nombres están aislados. Por lo tanto, los nombres idénticos que pueden existir en diferentes módulos no chocarán.

Los módulos pueden tener varias funciones y clases. Al llamar a una función se crea un espacio de nombres local donde se definen todos los nombres. Al igual que con las clases. La siguiente imagen puede ayudar a ilustrar este concepto.

Gráfico de diferentes espacios de nombres en Python

Ámbito de variables en Python

A pesar de que se han definido varios espacios de nombres únicos, es posible que no podamos acceder a ellos desde cada parte del programa. El concepto de ámbito entra en juego.

Scope is a part of the program from where you can directly access the namespace without any prefix.

There are at least three nested scopes at any given moment.

  1. The scope of the current function with local names

  2. The scope of the module with global names

  3. The outermost scope with built-in names

When referencing within a function, the name is searched in the local namespace, then in the global namespace, and finally in the built-in namespace.

If there is another function inside a function, the new scope is nested inside the local scope.

Example of Python scope and namespace

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

Here, the variableain the global namespace. Variablebin the local namespace of outer_function() whilecin the nested local namespace of inner_function().

when we are in inner_function()cin our localbin the non-localain the global. We can assigncread and assign a new value, but can only be read frombandainner_function().

If we try to assign as a valueb, a new variablebin the local namespace is different from the non-local creationb.The same thing happens when we assign a valueone.

But if we willadeclared as global a, all references and assignments will be moved to the globalaSimilarly, if we want to rebind the variablebIf it is necessary to declare it as a non-local variable, the following example will further illustrate this point.

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 the program is

a = 30
a = 20
a = 10

In this program, three different variables are defined in different namespaces.aand the corresponding access has been performed. In the following program,

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)

The output of the program is.

a = 30
a = 30
a = 30

Here, since the keyword global is used, all references and assignments point to the global variable a.