Todo lo que quería saber sobre el alcance en Python, pero se avergonzó de preguntar

En previsión del inicio de un nuevo hilo en el curso "Python Developer" , decidimos hablar sobre el alcance en Python. ¿Qué salió de esto? - Lea el material a continuación.




Hoy hablaremos sobre importantes fundamentos teóricos que deben ser entendidos y recordados para escribir un código competente, legible y hermoso. Hablaremos sobre el alcance de las variables. Este artículo será útil no solo para principiantes, sino también para programadores experimentados que vinieron a Python desde otro idioma y quieren entender su mecánica.

Los ámbitos determinan en qué parte del programa podemos trabajar con una variable particular y desde qué parte de la variable está "oculta". Es extremadamente importante entender cómo usar solo aquellos valores y variables que necesitamos, y cómo se comporta el intérprete de lenguaje. También veremos cómo sortear las restricciones impuestas por el alcance en acciones con variables. En Python, hay hasta 3 ámbitos:

  • Local
  • Global
  • No local

El último alcance no local se agregó en Python 3.

Por lo general, estamos hablando del alcance cuando estamos familiarizados con las funciones. Usando su ejemplo, consideraremos el trabajo del alcance de las variables.

Alcance local


Considere una función que muestra una lista some_listelemento por elemento:

def print_list(some_list):
    for element in some_list:
        print(element)

Aquí elementy some_listhay variables locales que son visibles solo dentro de la función, y que no se pueden usar fuera de ella con los valores que se les asignaron dentro de la función durante su operación. Es decir, si llamamos al cuerpo principal del programa print(element), obtenemos un error:

NameError: name 'element' is not defined


Ahora haremos lo siguiente:

def print_list(some_list):
    for element in some_list:
        print(element) 

element = 'q'
print_list([1, 2, 3])
print(element) 


Y obtenemos:

1
2
3
q

Aquí la variable elementdentro de la función y la variable con el mismo nombre fuera de ella son dos variables diferentes, sus valores no se cruzan y no se intercambian. Se llaman igual, pero se refieren a diferentes objetos en la memoria. Además, un elemento denominado variable dentro de la función vive mientras la función se ejecute y no más. Pero tenga cuidado para dar a las variables locales y globales el mismo nombre, ahora mostraré por qué:

def print_list(some_list):
    for element in sudden_list:
        print(element) 

sudden_list = [0, 0, 0]
print_list([1, 2, 3])

Resultado:

0
0
0

Tenga en cuenta que el intérprete no nos indicó errores. Y todo porque sudden_listestá en el ámbito global, es decir, desde el interior de la función print_listpodemos acceder a ella, porque desde el interior se puede ver lo que está sucediendo afuera. Por esa mecánica de trabajo, trate de nombrar las variables locales dentro de la función de manera diferente de lo que llama variables en el ámbito global.

Es importante hablar de constantes aquí. No hay diferencia para el intérprete de Python de lo que llama una variable, por lo que el código anterior se reescribirá mejor de la siguiente manera:

SUDDEN_LIST = [0, 0, 0]

def print_list(some_list):
    for element in SUDDEN_LIST:
        print(element) 

print_list([1, 2, 3]) 

Ahora todo está en su lugar. La cuestión es que, en Python, no se puede definir estrictamente una constante como un objeto que no debe modificarse. Entonces, la forma en que usa el valor de una variable cuyo nombre está escrito en letras mayúsculas solo queda en su conciencia. Otra pregunta es que de esta forma la variable registrada dejará en claro a quien lea su código que la variable no cambiará en ningún lado. O al menos no debería.

Alcance global


Python tiene una palabra clave globalque le permite cambiar el valor de una variable global desde una función. Está escrito antes del nombre de la variable, que se considerará global dentro de la función. Como puede ver en el ejemplo, ahora el valor de la variable está candyaumentando y tenga en cuenta que no lo pasamos como argumento a la función get_candy().

candy = 5

def get_candy():
    global candy 
    candy += 1
    print('  {} .'.format(candy))
    
get_candy()
get_candy()
print(candy)


Como resultado, obtenemos:


	  6 .
  7 .
7


Sin embargo, cambiar el valor de una variable global desde dentro de la función no es la mejor práctica, y es mejor no hacerlo, ya que no contribuye a la legibilidad del código. Cuanto más pequeño sea lo que ocurra dentro de la función dependerá del alcance global, mejor.

Life hack : para no sufrir el nombramiento de variables, puede poner el código del programa principal en una función main(), luego todas las variables que se declararán dentro de esta función permanecerán locales y no estropearán el alcance global, lo que aumenta la probabilidad de un error.

Alcance no local


Este concepto apareció en Python 3 junto con la palabra clave nonlocal. La lógica de su escritura es casi la misma que la de global. Sin embargo, nonlocalhay una característica. NonlocalSe usa con mayor frecuencia en funciones anidadas cuando queremos que el intérprete entienda que para una función anidada una determinada variable no es local, pero no es global en el sentido general.

def get_candy():
    candy = 5
    def increment_candy(): 
        nonlocal candy
        candy += 1
        return candy
    return increment_candy
    
result = get_candy()()
print(' {} .'.format(result))

Resultado:

 6 .

Qué útil es para ti decidir por ti mismo. Puedes encontrar más ejemplos aquí .

Como conclusión, se pueden formular varias reglas:

  1. Desde dentro de la función hay variables visibles que se han definido tanto dentro como fuera de ella. Las variables definidas internamente son locales y externamente globales.
  2. Fuera de las funciones, no hay variables definidas dentro de ellas visibles.
  3. , global.
  4. nonlocal , , .

Eso es todo, espero que este material te haya sido útil, y arroje al menos un poco de luz sobre cómo funciona el alcance en Python. Una vez que haya tratado con los ámbitos, hará otro nuestro para crear un código hermoso y legible.

También quiero invitar a todos a un seminario web gratuito de OTUS, donde estudiaremos una herramienta como la anotación de tipo en Python: discuta las razones por las que muchas personas lo subestiman, considere una serie de ejemplos de la práctica militar cuando la anotación de tipo podría salvar o salvar la situación. Hablemos sobre cómo y cuándo implementar la verificación de tipos en sus proyectos .

All Articles