Cuando ejecuto este código en Python 2.6
reduce(lambda x,y: x+[y], [1,2,3],[])
Obtengo [1, 2, 3] como se esperaba. Pero cuando ejecuto este (creo que es equivalente al anterior)
reduce(lambda x,y: x.append(y), [1,2,3],[])
Me sale un mensaje de error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'append'
¿Por qué estas dos líneas de código no dan el mismo resultado?
4 respuestas
x.append(y)
no es equivalente a x+[y]
; append
modifica una lista en su lugar y no devuelve nada, mientras que x+[y]
es una expresión que devuelve el resultado.
Se espera que el argumento de la función para reduce
devuelva el resultado de la operación.
x+[y]
hace eso, mientras que x.append(y)
no (este último modifica x
y devuelve None
).
Solo para explicar el mensaje de error:
AttributeError: 'NoneType' object has no attribute 'append'
La expresion
reduce(lambda x,y: x.append(y), [1,2,3],[])
Es equivalente a
[].append(1).append(2).append(3)
Como [].append(1)
no devuelve un valor, es decir, devuelve None
que intenta ejecutar (en el segundo paso)
None.append(2)
Que da como resultado el mensaje de error Nonetype object has no attribute append
reduce
llama a la función y utiliza el valor de retorno como el nuevo resultado. append
devuelve None
y, por lo tanto, la siguiente invocación append
falla. Podrías escribir
def tmpf(x,y):
x.append(y)
return x
reduce(tmpf, [1,2,3], [])
Y obtener el resultado correcto. Sin embargo, si el resultado es una lista del mismo tamaño que la entrada, no está buscando reducir: el resultado de la reducción generalmente debe ser un valor único. En su lugar, use mapa o simplemente
[x for x in [1,2,3]]
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.