Espacios de nombres: un espacio de nombres es un contenedor donde los nombres se asignan a los objetos, se utilizan para evitar confusiones en los casos en que existen los mismos nombres en diferentes espacios de nombres. Son creados por módulos, funciones, clases, etc.
Alcance: un alcance define el orden jerárquico en el que se deben buscar los espacios de nombres para obtener las asignaciones de nombre a objeto (variables). Es un contexto en el que existen variables y desde el que se referencian. Define la accesibilidad y el tiempo de vida de una variable. Tomemos un ejemplo simple como se muestra a continuación:
pi = 'outer pi variable' def print_pi(): pi = 'inner pi variable' print(pi) print_pi() print(pi)
Producción:
inner pi variable outer pi variable
El programa anterior da diferentes salidas porque el mismo nombre de variable pi reside en diferentes espacios de nombres, uno dentro de la función print_pi y el otro en el nivel superior. Cuando se ejecuta print_pi() , se imprime la ‘ variable pi interna ‘ ya que es el valor pi dentro del espacio de nombres de la función. El valor ‘ variable pi externa ‘ se imprime cuando se hace referencia a pi en el espacio de nombres externo. Del ejemplo anterior, podemos adivinar que definitivamente hay una regla que se sigue para decidir de qué espacio de nombres se debe elegir una variable.
Resolución de alcance a través de la regla LEGB:
en Python, la regla LEGBse utiliza para decidir el orden en que se buscarán los espacios de nombres para la resolución del alcance.
Los alcances se enumeran a continuación en términos de jerarquía (de mayor a menor/de menor a mayor):
- Local (L): Definido dentro de la función/clase
- Encerrado (E): definido dentro de funciones envolventes (concepto de función anidada)
- Global(G): Definido en el nivel más alto
- Integrado (B): nombres reservados en módulos integrados de Python
Local Scope :
Local scope refers to variables defined in current function.Always, a function will first look up for a variable name in its local scope. Only if it does not find it there, the outer scopes are checked.
# Local Scope pi = 'global pi variable' def inner(): pi = 'inner pi variable' print(pi) inner()
Producción:
inner pi variable
Al ejecutar el programa anterior, la ejecución de la función interna imprime el valor de su variable local (prioridad más alta en la regla LEGB) pi porque está definida y disponible en el ámbito local.
Ámbitos locales y globales:
si una variable no está definida en el ámbito local, se busca en el ámbito superior, en este caso, el ámbito global.
# Global Scope pi = 'global pi variable' def inner(): pi = 'inner pi variable' print(pi) inner() print(pi)
Producción:
inner pi variable global pi variable
Por lo tanto, como se esperaba, el programa imprime el valor en el ámbito local al ejecutar inner() . Es porque está definida dentro de la función y ese es el primer lugar donde se busca la variable. El valor pi en el ámbito global se imprime al ejecutar print(pi) en la línea 9.
Ámbitos locales, cerrados y globales:
para el ámbito cerrado, necesitamos definir una función externa que incluya la función interna, comentar la variable pi local de función interna y hacer referencia a pi usando la palabra clave nonlocal .
# Enclosed Scope pi = 'global pi variable' def outer(): pi = 'outer pi variable' def inner(): # pi = 'inner pi variable' nonlocal pi print(pi) inner() outer() print(pi)
Producción:
outer pi variable global pi variable
Cuando se ejecuta outside () , se ejecuta inner() y, en consecuencia, las funciones de impresión , que imprimen el valor de la variable pi adjunta. La declaración en la línea 10 busca la variable en el ámbito local de interior , pero no la encuentra allí. Dado que se hace referencia a pi con la palabra clave no local , significa que es necesario acceder a pi desde la función externa (es decir, el ámbito externo). Para resumir, el piLa variable no se encuentra en el ámbito local, por lo que se buscan los ámbitos superiores. Se encuentra tanto en ámbitos cerrados como globales. Pero según la jerarquía LEGB, la variable de alcance incluida se considera aunque tengamos una definida en el alcance global.
Ámbitos locales, cerrados, globales e integrados:
la comprobación final se puede realizar importando pi desde el módulo matemático y comentando las variables pi globales, cerradas y locales como se muestra a continuación:
# Built-in Scope from math import pi # pi = 'global pi variable' def outer(): # pi = 'outer pi variable' def inner(): # pi = 'inner pi variable' print(pi) inner() outer()
Producción:
3.141592653589793
Dado que pi no está definido en el ámbito local, cerrado o global, se busca el ámbito integrado, es decir, el valor pi importado del módulo matemático . Dado que el programa puede encontrar el valor de pi en el alcance más externo, se obtiene el siguiente resultado,
Publicación traducida automáticamente
Artículo escrito por SamyuktaSHegde y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA