¿Qué significa que un scope se determina de forma estática y se utiliza de forma dinámica?

Este es un extracto de los documentos de Python para las clases que me cuesta entender:

Un ámbito es una región textual de un progtwig de Python donde un espacio de nombres es directamente accesible. “Directamente accesible” aquí significa que una referencia no calificada a un nombre intenta encontrar el nombre en el espacio de nombres.

Aunque los scopes se determinan estáticamente, se usan dinámicamente.

No entendí lo que el autor quería decir con un scope de esta definición, qué es una región textual de un progtwig, y ​​lo que significa que los ámbitos están determinados estáticamente y se usan dinámicamente. Tengo una comprensión intuitiva de un scope, pero me encantaría apreciar completamente la definición de los documentos. Si alguien fuera tan amable de elaborar lo que el autor tenía en mente, sería muy apreciado.

    “Definido estáticamente”

    Existe un scope global y un scope local (ignoremos el tercero).

    Se determina si una variable es global o local en alguna función antes de llamarla, es decir, estáticamente .

    Por ejemplo:

    a = 1 b = 2 def func1(): c = 3 print func1.__code__.co_varnames # prints ('c',) 

    Se determina estáticamente que func1 tiene una variable local y que su nombre es c . Estáticamente, porque se realiza tan pronto como se crea la función, no más tarde cuando se accede a alguna variable local.

    ¿Cuáles son las consecuencias de eso? Bueno, por ejemplo, esta función falla:

     a = 1 def func2(): print a # raises an exception a = 2 

    Si los ámbitos fueran dynamics en Python, func2 habría impreso 1. En cambio, en línea con la print a , ya se sabe que a es una variable local, por lo que no se usará la a global. El local no se utilizará tampoco, porque aún no está inicializado.

    “Utilizado dinámicamente”

    Del mismo documento :

    Por otro lado, la búsqueda real de nombres se realiza dinámicamente, en tiempo de ejecución; sin embargo, la definición del idioma está evolucionando hacia una resolución de nombres estática, en tiempo de “comstackción”, ¡así que no confíe en la resolución de nombres dinámica! (De hecho, las variables locales ya están determinadas estáticamente).

    Las variables globales se almacenan en un diccionario. Cuando se accede a la variable global a, el intérprete busca la clave a en ese diccionario. Eso es el uso dynamic.

    Las variables locales no se utilizan de esa manera. El intérprete sabe de antemano cuántas variables tiene una función, por lo que puede dar a cada una una ubicación fija. Luego, el acceso a la variable local xy se puede optimizar simplemente tomando “la segunda variable local” o “la quinta variable local” , sin usar realmente el nombre de la variable.