EDIT: estúpida lógica mía se adelantó a mí. Los ninguno son solo los retornos de la llamada de comprensión. Ok, estoy ejecutando algunas pruebas en Python, y encontré un poco de diferencia en las órdenes de ejecución, lo que me lleva a entender cómo se implementa, pero me gustaría ejecutarlo por usted, gente amable para ver si estoy en lo cierto o si hay más. Considere este código:comprensión de la lista python VS por comportamiento
>>> a = ["a","b","c","d","e"]
>>> def test(self,arg):
... print "testing %s" %(arg)
... a.pop()
...
>>>[test(elem) for elem in a]
testing a
testing b
testing c
[None, None, None]
>>> a
['a', 'b']
#now we try another syntax
>>> a = ["a","b","c","d","e"]
>>> for elem in a:
... print "elem is %s"%(elem)
... test(elem)
...
elem is a
testing a
elem is b
testing b
elem is c
testing c
>>> a
['a', 'b']
>>>
Ahora bien, este me dice que el de elem en una: Obtiene el siguiente elemento iterables continuación, se aplica el cuerpo, mientras que la comprensión llama de alguna manera la función en cada elemento de la lista antes de ejecutar realmente el código en la función, entonces la modificación de la lista de la función (pop) lleva a] none, none, none]
¿Es esto correcto? ¿que está sucediendo aquí?
gracias
'test()' no devuelve nada, por lo tanto devuelve 'None'. (Por cierto, debe eliminar el parámetro 'self'.) –
sí, estoy jugando, quería ver si eran realmente equivalentes ... pero aquí hay algo para el orden de ejecución. – cromestant
Cambiar el tamaño de una colección (agregar o eliminar elementos) mientras se itera sobre ella es una ofensa punible. – delnan