Extraña compresión de lista y devaneo

Chema Cortes py en ls-l.org
Lun Feb 21 13:09:38 CET 2005


Lo primero que me resulta extraño es que la compresión de listas no 
tenga su propio "bloque de ejecución":

 >>> [x for x in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> x
9

Esto obliga a tener cuidado con las variables que se usan en la 
comprensión ya que pueden alterar variables del bloque donde se ejecutan.

Siguiendo con el "devaneo", pruebo con esta compresión:

[x for x in range(3),y for y in range(2)]

Así, sin más, da error porque "no está definida la variable y". La 
defino y pruebo:

 >>> y=0
 >>> [x for x in range(3),y for y in range(2)]
[[0, 1, 2], [0, 1, 2], 0, 0]
 >>> [x for x in range(3),y for y in range(2)]
[[0, 1, 2], [0, 1, 2], 1, 1]
 >>>

A parte de que salen resultados distintos (ya he dicho que hay que tener 
cuidado con las variables locales), yo estaba esperando un resultado 
diferente, algo así:

[[0, 1, 2], [0, 1]]

que correspondería a haber hecho

[ [x for x in range(3)] , [y for y in range(2)] ]

pero, parecer ser, el parser interpreta "implícitamente" una tupla, como 
si fuera:

[x for x in (range(3),y) for y in range(2)]


Me resulta curioso, sin embargo, que la siguiente compresión de lista dé 
error:

[x,y for x in range(3) for y in range(2)]

Aquí sí que obliga a explicitar la tupla que pasamos en la expresión:

[(x,y) for x in range(3) for y in range(2)]


En fin, supongo que todo tendrá su razón de ser.  Está claro que, para 
evitar problemas, hay que ser lo más explícito posible a la hora de 
codificar.




Más información sobre la lista de distribución Python-es