Estoy sorprendido por el comportamiento de List Comprehension en un list de lists. Esperaría que List comprehension me devuelva una nueva lista SIEMPRE. Por ejemplo:

>>> L = [1,2,3,4,5,6]
>>> M = [ x * 2 for x in L]
>>> L
>>> [1,2,3,4,5,6]
>>> M
>>> [2,4,6,8,10,12]

Entonces L no se cambia.

Sin embargo


>>> L = [[1], [2], [3]]
>>> M = [x.append(100) for x in L]
>>> M
>>> [None, None, None]
>>> L
>>> [[1,100], [2,100], [3,100]]

Ahora L se cambia y list comprehension no devuelve una nueva Lista.

Espero una nueva Lista por la comprensión de la lista. Cualquier explicación me ayudaría a comprender este comportamiento de list comprehension

-1
Dilshad Abduwali 2 oct. 2019 a las 15:09

3 respuestas

La mejor respuesta

x * 2 es una expresión que se evalúa como resultado y su resultado se almacenará en la lista M.

x.append(100) por otro lado aplica la función append() en el objeto x, que es un elemento de la lista L y devuelve None.

Es lo mismo, por qué haces y = x * 2, pero no y = x.append(100).

1
Simon Fink 2 oct. 2019 a las 12:19

Usted está agregando a x, es un elemento en L, es por eso que L cambia. Si desea una nueva lista, no mute una anterior, cree una nueva.

No especificas el resultado que esperas, pero creo que esto es lo que estás buscando:

>>> L = [[1], [2], [3]]
>>> M = [[*x, 100] for x in L]
>>> L
[[1], [2], [3]]
>>> M
[[1, 100], [2, 100], [3, 100]]
1
Pedro Rodrigues 2 oct. 2019 a las 15:22
x.append(100)

No devuelva nada (Ninguno), por eso solo tiene Ninguno dentro de M.

1
user3180528 2 oct. 2019 a las 12:16
58201224