2 votes

Python in-place swapping

Le bloc de code suivant ne fonctionne pas.

a = [2,1,3]
i = 1
a[i], a[a[i]-1] = a[a[i]-1], a[i]

Alors que là, oui.

a = [2,1,3]
i = 1
j = a[i]-1
a[i], a[j] = a[j], a[i]

Quelqu'un le sait-il ?

5voto

ShadowRanger Points 44

Le côté gauche des égaux est assigné de gauche à droite, et chaque terme n'est évalué que lorsqu'il est atteint. Cela signifie que :

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

est équivalent à :

tmp = a[a[i]-1], a[i]
a[i] = tmp[0]       # Changes a[i]
a[a[i]-1] = tmp[1]  # USES new a[i] to determine assignment index!!!

qui indique clairement que l'affectation à a[i] se termine, alors le nouveau valeur de a[i] est utilisé pour calculer l'indice de la deuxième affectation.

Votre code de travail fonctionne parce qu'il met en cache le vieux valeur de a[i] donc la réaffectation a[i] ne change pas l'emplacement de la deuxième valeur ; le code équivalent ici le précise :

j = a[i]-1           # Caches old a[i]
tmp = a[j], a[i]
a[i] = tmp[0]        # Changes a[i]
a[j] = tmp[1]        # Changes using original a[i] as intended

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X