2011-08-10 3 views
16

Tout le monde sait que dans les affectations Python ne renvoient pas une valeur, sans doute pour éviter les affectations sur les déclarations if quand habituellement juste une comparaison a pour but:valeur de l'instruction Affectation

>>> if a = b: 
    File "<stdin>", line 1 
    if a = b: 
     ^
SyntaxError: invalid syntax 

>>> if a == b: 
...  pass 
... 

Pour la même raison, on pourrait penser que plusieurs affectations sur la même déclaration étaient également des erreurs de syntaxe.

En fait, a = (b = 2) n'est pas une expression valide:

>>> a = (b = 2) 
    File "<stdin>", line 1 
    a = (b = 2) 
     ^
SyntaxError: invalid syntax 

Alors, ma question est: pourquoi a = b = 2 fonctionne en Python comme il travaille dans d'autres langues où les instructions d'affectation ont une valeur, comme C?

>>> a = b = c = 2 
>>> a, b, c 
(2, 2, 2) 

Ce comportement est-il documenté? Je ne pouvais rien trouvé à ce sujet dans la documentation de l'instruction d'affectation: http://docs.python.org/reference/simple_stmts.html#assignment-statements

Répondre

24

Il est là, dans la syntaxe:

assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression) 

Le petit + à la fin de (target_list "=")+ signifie « un ou plusieurs ». Ainsi, la ligne a = b = c = 2 ne comprend pas 3 instructions d'affectation, mais une seule instruction d'affectation avec 3 listes cibles.

Chaque liste cible se compose à son tour d'une seule cible (un identifiant dans ce cas).

Il est également dans le texte (Souligné par l'auteur):

Une instruction d'affectation [...] attribue le seul objet résultant à chacune des listes cible, de gauche à droite.

Cela peut conduire à des résultats intéressants:

>>> (a,b) = c = (1,2) 
>>> (a, b, c) 
(1, 2, (1, 2)) 
-1
a = b = c = 2 
b = 3 
print a,b,c 
>>> 2 3 2 
0

Un autre bel exemple:

>>a,b,c = b = 1,2,3 
>>b 
(1, 2, 3) 
Questions connexes