Diferente comportamiento para la lista .__ iadd__ y la lista .__ add__

Considere el siguiente código:

>>> x = y = [1, 2, 3, 4] >>> x += [4] >>> x [1, 2, 3, 4, 4] >>> y [1, 2, 3, 4, 4] 

y luego considera esto:

 >>> x = y = [1, 2, 3, 4] >>> x = x + [4] >>> x [1, 2, 3, 4, 4] >>> y [1, 2, 3, 4] 

¿Por qué hay una diferencia entre estos dos?

(Y sí, traté de buscar esto).

__iadd__ muta la lista, mientras que __add__ devuelve una nueva lista, como se muestra.

Una expresión de x += y primero intenta llamar a __iadd__ y, en su defecto, las llamadas a __add__ siguieron una asignación (vea el comentario de Sven para una corrección menor). Como la list tiene __iadd__ entonces hace un poco de magia de mutación.

La primera muta la lista y la segunda vuelve a unir el nombre.