web-dev-qa-db-fra.com

Comment fonctionne l'opérateur de virgule de Python pendant l'affectation?

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?

27
thiruvenkadam

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
31
Mark Byers

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 .

19
Sven Marnach

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.

16
Preet Kukreti