2010-10-15 23 views
5

Si consideri questa funzione getPos() che restituisce una tupla. Qual è la differenza tra i due seguenti incarichi? Da qualche parte ho visto un esempio in cui è stato utilizzato il primo incarico, ma quando ho appena provato il secondo, sono rimasto sorpreso anche del suo funzionamento. Quindi, c'è davvero una differenza, o Python capisce solo che la parte per la mano sinistra dovrebbe essere una tupla?x, y = getPos() vs. (x, y) = getPos()

def getPos(): 
    return (1, 1) 

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

risposta

8

Per saperne di circa tuples:

Una tupla è costituito da un certo numero di valori separati da virgole (...)

Quindi una parentesi non fa una tupla a una tupla. Le virgole lo fanno.

parentesi sono necessarie solo se si dispone di strane strutture nidificate:

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

anche per fare un singolo value tuple: '(x,)' – fortran

+0

Sì, anche se i termini "tuple packing" e "tuple unpacking" suggeriscono che non è così semplice come gli elenchi separati da virgola sono sempre tuple letterali. – Skilldrick

+1

Ad esempio, 'type (1, 2, 3)' non restituisce 'tuple'. – Skilldrick

5

Sì, si chiama tuple unpacking:

"tuple spacchettamento richiede che l'elenco delle variabili sulla sinistra ha lo stesso numero di elementi come la lunghezza della tupla." - Guido Van Rossum

"Quando si usano tuple o liste sul lato sinistro del simbolo =, Python accoppia gli oggetti sul lato destro con i target sulla sinistra e li assegna da sinistra a destra." - Lutz e Ascher

3

sì, e funziona anche su lista

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

non c'è alcuna differenza.

4

Non c'è differenza:

>>> 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   

Sia a, b e (a, b) specificare una tupla, e avete bisogno di una tupla nella LHS (lato sinistro) per tupla disimballo :)

Problemi correlati