Intercambiando elementos en listas en python.

Tengo una lista y necesito intercambiar el primer elemento de la lista con el elemento máximo en la lista.

Pero, ¿por qué funciona el código 1 mientras que el código 2 no funciona?

código 1:

a = list.index(max(list)) list[0], list[a] = list[a], list[0] 

código 2:

 list[0], list[list.index(max(list))] = list[list.index(max(list))], list[0] 

Pensé que Python primero evaluaría el lado derecho antes de asignarlo a los nombres de la izquierda.

Python almacena los resultados en múltiples objectives de izquierda a derecha , ejecutando la expresión de destino de asignación en ese orden.

Así que su segunda versión esencialmente se reduce a esto:

 temp = list[list.index(max(list))],list[0] list[0] = temp[0] list[list.index(max(list))] = temp[1] 

Tenga en cuenta que list.index(max(list)) se ejecuta después de que se modificó la list[0] , y ahí es donde acaba de almacenar el valor máximo.

Esto se documenta en la documentación de las declaraciones de asignación :

  • Si la lista de objectives es una lista de objectives separados por comas: el objeto debe ser iterable con el mismo número de elementos, ya que hay objectives en la lista de objectives, y los elementos se asignan, de izquierda a derecha , a los objectives correspondientes.

De ahí en adelante es como si cada objective fuera un solo objective, por lo que la siguiente documentación se aplica de izquierda a derecha a cada objective:

La asignación de un objeto a un solo objective se define recursivamente de la siguiente manera.

[…]

  • Si el objective es una suscripción: se evalúa la expresión principal en la referencia. Debería producir un objeto de secuencia mutable (como una lista) o un objeto de mapeo (como un diccionario). A continuación, se evalúa la expresión del subíndice.

Si cambia el orden de las asignaciones, su código funcionaría:

 list[list.index(max(list))], list[0] = list[0], list[list.index(max(list))] 

porque ahora la list[list.index(max(list))] se asigna primero .