Conditions préalables - 2 Points importants
-
Les listes sont mutable
La partie principale dans les listes, c'est que les listes sont mutables. Cela signifie que l'
les valeurs de listes peuvent être modifiées. C'est l'un de la raison pour laquelle vous êtes
face à la difficulté. Consultez la documentation pour plus d'info
-
Ordre d'Évaluation
L'autre partie est que pendant le déballage d'un n-uplet, le début de l'évaluation
de gauche à droite. Consultez la documentation pour plus d'info
Introduction
lorsque vous effectuez a,b = c,d
les valeurs de c
et d
sont d'abord stockées. Puis à partir de la gauche, la valeur de a
est d'abord changé d' c
, puis la valeur de b
est changé en d
.
Le hic, c'est que si il y a des effets secondaires liés à l'emplacement de b
tandis que l'évolution de la valeur de a
, alors d
est attribué au plus tard b
, ce qui est l' b
touchés par les effets secondaires de l' a
.
Cas D'Utilisation
Maintenant, pour en venir à votre problème
Dans le premier cas,
nums = [1, 2, 0]
nums[nums[0]], nums[0] = nums[0], nums[nums[0]]
nums[0]
est initialement 1
et nums[nums[0]]
est 2
parce qu'il évalue à l' nums[1]
. Donc 1,2 est maintenant enregistré dans la mémoire.
Maintenant tuple déballage qui se passe du côté gauche, de sorte
nums[nums[0]] = nums[1] = 1 # NO side Effect.
nums[0] = 2
par conséquent print nums
imprime [2, 1, 0]
Toutefois, dans ce cas
nums = [1, 2, 0]
nums[0], nums[nums[0]] = nums[nums[0]], nums[0]
nums[nums[0]], nums[0]
met 2,1 sur la pile tout comme le premier cas.
Cependant, sur le côté gauche, c'est - nums[0], nums[nums[0]]
, l'évolution de l' nums[0]
a un effet secondaire tel qu'il est utilisé comme index dans nums[nums[0]]
. Ainsi
nums[0] = 2
nums[nums[0]] = nums[2] = 1 # NOTE THAT nums[0] HAS CHANGED
nums[1]
reste inchangé à valeur 2
. par conséquent print nums
imprime [2, 2, 1]