Extraña compresión de lista y devaneo

Marcos Sánchez Provencio rapto en arrakis.es
Lun Feb 21 13:24:53 CET 2005


En las próximas versiones se prevé un bloque de ejecución para las
listas autodefinidas (para las expresiones generadoras se ha hecho así
desde el principio). Se pensó dejar definida la variable del bucle para
favorecer la migración de código existente, pero se ve que se han echado
otra cuenta.

El lun, 21-02-2005 a las 13:09 +0100, Chema Cortes escribió:
> 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.
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es

------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


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