Los conceptos de espacios de nombres y ámbitos se han mencionado anteriormente, como la función incorporada globals() , el alcance de las variables en las funciones, las importaciones utilizadas por los módulos, etc. Estos pueden darnos una comprensión general de estos dos conceptos. Esta sección se discutirá en detalle.
Espacio de nombres Python
Un espacio de nombres es una asignación de nombre a objeto.
Para entender este concepto, hagamos una analogía: Hexi Village tiene un personal (objeto) llamado Zhang San (nombre), y Hedong Village tiene un personal (objeto) también llamado Zhang San (nombre), ambos de los cuales se llaman Zhang San (nombre). Pero no son la misma persona (objeto) porque pertenecen a diferentes aldeas (espacios de nombres). Un día, el nombre de Zhang San en Hexi Village era ruidoso y se extendió a la ciudad (el nombre se importó al espacio de "ciudad"). Cuando la gente de la ciudad habló de "Zhang San", dijeron que Hexi Village, si Zhang San de Hedong Village debe decir específicamente "Zhang San de Pueblo de Hedong. Zhang San " ( Pueblo de Hedong. Zhang San ). Esto es lo que significa el espacio de nombres: asignar el nombre al rango de nombre del objeto.
Actualmente, la mayoría de los espacios de nombres están implementados por los diccionarios de Python. Por lo general, no les prestamos atención. Cuando se trata de problemas de rendimiento, esta implementación puede cambiar en el futuro. Por lo tanto, no necesitamos profundizar en la implementación interna del espacio de nombres, sino que debemos entender su uso.
Aquí hay algunos ejemplos de espacios de nombres:
- Una colección de funciones incorporadas (incluidas las funciones integradas como
print() y las excepciones integradas, etc.);
- El nombre global en el módulo;
- El nombre local en la llamada de función.
Además, en cierto sentido, la colección de propiedades de un objeto también es una forma de espacio de nombres. Como mencionamos en el ejemplo anterior de Zhang San, no existe una relación entre los nombres en diferentes espacios de nombres. Por ejemplo, dos módulos diferentes pueden definir la función max() sin confusión, y el usuario del módulo debe agregar un nombre de módulo delante de él para llamar a una función max() . (Ver el uso de la importación para más detalles)
Propiedades de Python
Nos referimos a cualquier nombre que sigue a un Número de punto como atributo . Por ejemplo, en la expresión a.name , real es un atributo del objeto a . También una referencia a una función en un módulo es una referencia de propiedad. En la expresión modname.funcname , modname es un objeto de módulo, y funcname es una de sus propiedades.
Los atributos pueden ser de solo lectura o de escritura. Si se puede escribir, entonces podemos asignar valores a la propiedad, por ejemplo, modname.name = '猿人学Python' . Las propiedades de escritura también se pueden eliminar con la declaración del . Por ejemplo, del modname.name eliminará el atributo de name del objeto modname .
Los espacios de nombres creados en diferentes momentos tienen diferentes tiempos de vida:
- El espacio de nombres que contiene el nombre incorporado se crea cuando se inicia el intérprete de Python y nunca se eliminará (a menos que se salga del intérprete);
- El espacio de nombres global del módulo se crea cuando se importa la definición del módulo. Normalmente, el espacio de nombres del módulo continuará hasta que el intérprete salga;
- Las declaraciones que se leen desde un archivo de script (
.py o .pyc ) o se leen de forma interactiva (intérprete de intérprete) y se ejecutan mediante la llamada de nivel superior del __main__ se consideran parte de la __main__ módulo __main__ , que tiene su propio espacio de nombres global;
- El espacio de nombres local de la función se crea en el momento en que se llama a la función y se elimina cuando la función devuelve o lanza una excepción que no se maneja dentro de la función. Cada llamada recursiva a una función recursiva crea su propio espacio de nombres local;
El nombre incorporado realmente existe en un módulo llamado builtins .
Alcance de pitón
Ámbito es el área de texto de un código Python que puede ser emitido directamente por un espacio de nombres. El término "directamente accesible" significa que una referencia sin descripción (no restrictiva) a un nombre intenta buscar el nombre en el espacio de nombres.
Aunque los alcances están determinados estáticamente, se usan dinámicamente. En cualquier momento durante la ejecución, hay al menos tres ámbitos anidados cuyos espacios de nombres son directamente accesibles:
- Ámbito más interno: primera búsqueda del ámbito, incluido el nombre local
- Ámbito de función cerrada: búsquedas desde el ámbito cerrado más reciente, incluidos los nombres no locales, incluidos los nombres no globales
- Segundo a último ámbito: contiene el nombre global del módulo actual
- El ámbito más externo: la última búsqueda es un espacio de nombres con un nombre incorporado
Si un nombre se declara como una variable global, todas las referencias y asignaciones apuntarán directamente al ámbito intermedio que contiene el nombre global del módulo.Para volver a enlazar las variables que se encuentran fuera del ámbito más interno, puede declararlas como variables no locales utilizando la declaración no local. Si no se declara como una variable no local, estas variables serán de solo lectura (al intentar escribir dicha variable solo se creará una nueva variable local en el ámbito más interno, mientras que la variable externa del mismo nombre no se modificará).
Es importante tener en cuenta que el alcance se determina textualmente, y el alcance global de la función definida dentro del módulo es el espacio de nombres del módulo, independientemente de dónde se llame la función o por qué alias. Por otro lado, la búsqueda del nombre real se realiza dinámicamente en tiempo de ejecución.
Una característica especial de Python es que si no hay una declaración global válida, la asignación al nombre siempre va al ámbito más interno. La asignación no copia los datos, simplemente vinculan el nombre al objeto. Lo mismo es cierto para las eliminaciones, donde la declaración del x elimina el enlace a x de la referencia al espacio de nombres local. De hecho, todas las operaciones que introducen nombres nuevos utilizan ámbitos locales, especialmente declaraciones de import y definiciones de funciones que unen los nombres de funciones o módulos en el ámbito local.
global declaración global se puede usar para indicar que una variable en particular vive en el alcance global y debe ser nonlocal en ella, la declaración nonlocal indica que la variable en particular vive en el alcance externo y debe nonlocal en ella.
Veamos un ejemplo de un ámbito y espacio de nombres que demuestra cómo el tráfico se refiere a diferentes ámbitos y espacios de nombres y cómo lo global y lo nonlocalafectan la vinculación de variables:
def scope_demo():
def do_local():
name = 'local name'
def do_nonlocal():
nonlocal name
name = 'nonlocal name'
def do_global():
global name
name = 'global name'
name = 'demo name'
do_local()
print('After local assignment:', name)
do_nonlocal()
print('After nonlocal assignment:', name)
do_global()
print('After global assignment:', name)
scope_demo()
print('In global scope:', name)
Piénselo, ¿qué tipo de resultados generará el código anterior? Si entiendes la explicación anterior, el resultado de tu pensamiento debería ser así:
After local assignment: demo name
After nonlocal assignment: nonlocal name
After global assignment: nonlocal name
In global scope: global name
Se debe tener en cuenta que la función do_global() modifica el name variable global y no modifica el name de la variable local de la función scope_demo() , por lo name se imprime After global assignment: nonlocal name name no local.
La asignación local (de forma predeterminada) no cambia el enlace de scope_demo al name ; la asignación no local cambia el scope_demo de la función scope_demo al name , y global asignación global cambia el enlace del nivel del módulo (no el name dentro de scope_demo sino fuera de él) name bajo el alcance global).
Resumen de espacio y comando de comando:
Un espacio de nombres define un rango de nombres que especifican un área de texto (código) que puede ver el espacio de nombres. Cuando se ejecuta el código, el orden y el alcance de la búsqueda de nombres son los siguientes:
- Ámbito más interno: primera búsqueda del ámbito, incluido el nombre local
- Ámbito de función cerrada: búsquedas desde el ámbito cerrado más reciente, incluidos los nombres no locales, incluidos los nombres no globales
- Segundo a último ámbito: contiene el nombre global del módulo actual
- El ámbito más externo: la última búsqueda es un espacio de nombres con un nombre incorporado
Ejercicios relacionados
Consulte scope_demo() para practicar la asignación local, la asignación no local y la asignación global.
留言
張貼留言