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