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 ?
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 ?
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 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.