Semántica de asignación simultánea en Python.

Considere el siguiente código de Python 3:

a = [-1,-1,-1] i = 0 

Y ahora considere las siguientes dos versiones de una asignación simultánea sobre a y i:

Asignación versión 1:

 a[i],i = i,i+1 

Asignación versión 2:

 i,a[i] = i+1,i 

Espero que estas dos versiones de asignaciones simultáneas sean semánticamente equivalentes. Sin embargo, si verifica los valores de a y i después de cada una de las asignaciones simultáneas, obtendrá diferentes estados:

    Salida para print(a,i) después de la asignación versión 1:

     [0, -1, -1] 1 

    Salida para print(a,i) después de la asignación versión 2:

     [-1, 0, -1] 1 

    No soy un experto en semántica de Python, pero este comportamiento parece extraño. Espero que ambas asignaciones se comporten como la versión de asignación 1. Además, si revisa el siguiente enlace, uno esperaría que ambas versiones de la asignación lleven al mismo estado:

    Enlace al extracto del libro en Google Books

    ¿Hay algo que me esté perdiendo con respecto a la semántica de Python para tareas simultáneas?

    Nota : este extraño comportamiento no parece reproducible, por ejemplo, cuando la variable a tiene un tipo entero; Parece que se requiere a lista de tipos (a lo mejor este es el caso de cualquier tipo mutable).

    En este caso:

     i, a[i] = i + 1, i 

    El lado derecho se evalúa como una tupla (1, 0). Luego, esta tupla se desempaqueta en i y luego a[i] . a[i] se evalúa durante el desembalaje, no antes, por lo que corresponde a a[1] .

    Dado que el lado derecho se evalúa antes de que se realice el desempaque, referirse a a[i] en el lado derecho siempre sería a[0] independientemente del valor final de i

    Aquí hay otro ejemplo de diversión inútil para que trabajes

     >>> a = [0,0,0,0] >>> i, a[i], i, a[i] = range(4) >>> a [1, 0, 3, 0]