2010-10-15 20 views
5

Considere esta función getPos() que devuelve una tupla. ¿Cuál es la diferencia entre las dos siguientes asignaciones? En algún lugar vi un ejemplo en el que se usó la primera tarea, pero cuando probé la segunda, me sorprendió que también funcionara. Entonces, ¿existe realmente una diferencia, o Python simplemente se da cuenta de que la parte de la izquierda debe ser una tupla?x, y = getPos() vs. (x, y) = getPos()

def getPos(): 
    return (1, 1) 

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

Respuesta

8

Lea acerca de tuples:

Una tupla consiste en una serie de valores separados por comas (...)

Así que el paréntesis no convierte una tupla en una tupla. Las comas lo hacen.

paréntesis sólo son necesarios si tiene extrañas estructuras anidadas:

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

también para hacer una sola tuple de valor: '(x)' – fortran

+0

Sí, aunque los términos "tuple packing" y "tuple desempaquetar" sugieren que no es tan sencillo como las listas separadas por comas siendo siempre tuplas literales. – Skilldrick

+1

Por ejemplo, 'tipo (1, 2, 3)' no devuelve 'tuple'. – Skilldrick

5

Sí, se llama tuple unpacking:

"desempaquetado de tuplas requiere que la lista de variables de la izquierda tiene el mismo número de elementos como la duración de la tupla." - Guido Van Rossum

"Cuando utiliza tuplas o listas en el lado izquierdo de =, Python empareja los objetos en el lado derecho con los objetivos de la izquierda y los asigna de izquierda a derecha". - Lutz y Ascher

3

sí, y funciona también en la lista

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

No hay ninguna diferencia.

4

No hay diferencia:

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

Tanto a, b y (a, b) especificar una tupla, y que necesita una tupla en el LHS (lado izquierdo) para descomprimir tupla :)