2010-10-15 11 views
5

Considérons cette fonction getPos() qui retourne un tuple. Quelle est la différence entre les deux affectations suivantes? Quelque part, j'ai vu un exemple où la première affectation a été utilisée mais quand j'ai juste essayé le second, j'ai été surpris que cela fonctionne aussi. Donc, y a-t-il vraiment une différence, ou est-ce que Python a juste compris que la partie gauche devrait être un tuple?x, y = getPos() et (x, y) = getPos()

def getPos(): 
    return (1, 1) 

(x, y) = getPos() # First assignment 
x, y = getPos() # Second assignment 

Répondre

8

Lire à propos tuples:

Un tuple se compose d'un certain nombre de valeurs séparées par des virgules (...

Donc parenthèse ne fait pas un tuple un tuple. Les virgules le font.

Parenthèses ne sont nécessaires que si vous avez d'étranges structures imbriquées:

x, (y, (w, z)), r 
+2

aussi faire une seule valeur tuple: '(x,)' – fortran

+0

Oui, bien que les termes «tuple packing» et «tuple unpacking» suggèrent que ce n'est pas aussi simple que les listes séparées par des virgules sont toujours des tuples littéraux. – Skilldrick

+1

Par exemple, 'type (1, 2, 3)' ne retourne pas «tuple». – Skilldrick

5

Oui, il est appelé tuple unpacking:

« déballer Tuple exige que la liste des variables sur la gauche a le même nombre d'éléments que la longueur du tuple. » - Guido Van Rossum

"Lorsque vous utilisez des tuples ou des listes sur le côté gauche du =, Python associe des objets sur le côté droit avec des cibles sur la gauche et les affecte de gauche à droite." - Lutz et Ascher

3

oui, et cela fonctionne aussi sur la liste

>>> x,y,z = range(3) 
>>> print x, y, z 
0 1 2 
>>> 
1

Il n'y a pas de différence.

4

Il n'y a pas de différence:

>>> import dis 
>>> dis.dis(compile("a,b = expr()", "", "single")) 
    1   0 LOAD_NAME    0 (expr) 
       3 CALL_FUNCTION   0 
       6 UNPACK_SEQUENCE   2 
       9 STORE_NAME    1 (a) 
      12 STORE_NAME    2 (b) 
      15 LOAD_CONST    0 (None) 
      18 RETURN_VALUE   
>>> dis.dis(compile("(a,b) = expr()", "", "single")) 
    1   0 LOAD_NAME    0 (expr) 
       3 CALL_FUNCTION   0 
       6 UNPACK_SEQUENCE   2 
       9 STORE_NAME    1 (a) 
      12 STORE_NAME    2 (b) 
      15 LOAD_CONST    0 (None) 
      18 RETURN_VALUE   

Les deux a, b et (a, b) spécifier un tuple, et vous avez besoin d'un tuple dans le LHS (côté gauche) pour déballer tuple :)