Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre la ubicacion de los nombres (variables) dentro de las compresiones y generadores.

Anuncios

Como python 3 ubica variantes de loop en los cuatro tipos de compresiones (dict, set, list y expresiones generadoras), esto hace que su conducta difiera de un bucle for comun, veamos un ejemplo para todos estos casos y para ello crearemos un archivo llamado alcances.py y le agregaremos el siguiente codigo:

alcances.py

A = 100
ex1 = [A for A in range(5)]
print(A)

ex2 = list(A for A in range(5))
print(A)

ex3 = dict((A, 2 * A) for A in range(5))
print(A)

ex4 = set(A for A in range(5))
print(A)
Anuncios

Primero generamos una variable llamada A a la cual le definimos un valor, luego crearemos una expresion generadora, donde le pasaremos el valor de A generado por medio del bucle interno que se rellenara con el range que posee para finalmente mostrar el valor de A, despues repetiremos el mismo esquema pero esta vez para los otros tipos de comprensiones como list, dict y set, pero que sucedera cuando lo ejecutemos? veamos:

tinchicus@dbn001vrt:~/python$ python3 alcances.py 
100
100
100
100
tinchicus@dbn001vrt:~/python$
Anuncios

Como pueden ver en todos los casos nos imprimio el valor global de A, vamos a tomar el codigo anterior y agreguemos el siguiente bloque:

s = 0
for A in range(5):
        s += A
print(A)
Anuncios

En este nuevo bloque definiremos una nueva variable, luego ira un bucle for donde crearemos un iterador por medio del range y con el valor del iterador iremos incrementando la variable definida anteriormente, por ultimo mostramos el valor de A, veamos que sucede:

tinchicus@dbn001vrt:~/python$ python3 alcances.py 
100
100
100
100
4
tinchicus@dbn001vrt:~/python$ 
Anuncios

Como podemos ver ahora nuestra variable si fue modificada pero en este momento diran cual es la sorpresa? dentro de las comprensiones utiliza a la variable A como local y esto no afectara a la global porque como vimos en este post si nosotros tenemos una variable global esta se encuentra al alcance de todos los lugares del codigo, verdad? Entonces porque no se ve afectada en los bucles de las comprensiones pero si en el bucle que agregamos? Esto es debido a lo mencionado anteriormente, python crea variables para los loops de las comprensiones por lo tanto no afectan a la global si se llaman iguales, en cambio la que este fuera de las comprensiones si afectara a las variables globales, por ultimo para chequear esto vamos a agregar la siguiente linea detras del bucle anterior:

print(globals())
Anuncios

Veamos como quedo nuestro codigo final antes de ejecutarlo:

alcances.py

A = 100
ex1 = [A for A in range(5)]
print(A)

ex2 = list(A for A in range(5))
print(A)

ex3 = dict((A, 2 * A) for A in range(5))
print(A)

ex4 = set(A for A in range(5))
print(A)

s = 0
for A in range(5):
	s += A
print(A)
print(globals())
Anuncios

Procedamos a ejecutarlo para ver su salida:

tinchicus@dbn001vrt:~/python$ python3 alcances.py 
100
100
100
100
4
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f9aaefb9160>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'alcances.py', '__cached__': None, 'A': 4, 'ex1': [0, 1, 2, 3, 4], 'ex2': [0, 1, 2, 3, 4], 'ex3': {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}, 'ex4': {0, 1, 2, 3, 4}, 's': 10}
tinchicus@dbn001vrt:~/python$
Anuncios

Observen como podemos ver los valores globales, en este caso vemos el valor final de A, de la variable s que incrementamos en el ultimo bucle pero tambien observen como estan creadas todas las expresiones anteriores demostrando lo que recalcamos anteriormente.

Anuncios
Nota: 
Vean como esta almacenado A, figura como un valor de tipo clave-valor.
Anuncios

En resumen, hoy hemos visto que es la ubicacion de nombres, como el lenguaje difiere la ubicacion de las variables o nombres de bucles internos de las comprensiones con respecto a bucles normales, como generamos una excepcion donde una variable global no es afectada por un componente del codigo, a pesar de su conducta, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.00