Je lisais les instructions d'affectation dans les documents Python ( http://docs.python.org/reference/simple_stmts.html#assignment-statements ).
En cela, il est cité que:
Si la cible est une liste cible entre parenthèses ou entre crochets: l'objet doit être un itérable avec le même nombre d'éléments qu'il y a de cibles dans la liste cible, et ses éléments sont attribués, de gauche à droite, à la valeur correspondante cibles.
Après l'avoir lu, j'ai pensé à écrire un échantillon comme celui-ci:
a = 5
b = 4
a, b = a + b, a
print a, b
Mon hypothèse était que a et b devraient tous deux avoir la valeur 9.
Cependant, je me trompe. "a" a la valeur de 9 et "b" a la valeur de 5.
Quelqu'un peut-il m'aider à mieux comprendre cela? Pourquoi l'ancienne valeur de "a" est-elle attribuée plutôt que la nouvelle? Selon les documents, la valeur de a sera attribuée en premier, non? Suis-je en train de manquer quelque chose?
Toutes les expressions à droite de l'opérateur d'affectation sont évaluées avant d'effectuer l'une des affectations.
Du Tutoriel Python: Premiers pas vers la programmation :
La première ligne contient une affectation multiple: les variables a et b obtiennent simultanément les nouvelles valeurs 0 et 1. Sur la dernière ligne, cela est utilisé à nouveau, démontrant que les expressions sur le côté droit sont tous évalués en premier avant que les affectations aient lieu . Les expressions de droite sont évaluées de gauche à droite.
Je souligne.
Votre code est fonctionnellement équivalent au suivant:
a, b = 5 + 4, 5
print a, b
Python n'a pas d '"opérateur virgule" comme en C. Au lieu de cela, la virgule indique qu'un Tuple doit être construit. Le côté droit de
a, b = a + b, a
est un tuple avec les deux éléments a + b
et a
.
Sur le côté gauche d'une affectation, la virgule indique que le décompression de séquence doit être effectué selon les règles que vous avez citées: a
se verra attribuer le premier élément du Tuple, b
le second .
Vous pouvez penser aux affectations se déroulant en parallèle sur les copies plutôt que séquentiellement et sur place.
C'est pourquoi en python vous n'avez pas besoin d'une fonction de swap:
a, b = b, a
fonctionne suffisamment sans nécessiter une variable temporaire, c
.