Semántica de múltiples asignaciones.

En Python se puede hacer:

a, b = 1, 2 (a, b) = 1, 2 [a, b] = 1, 2 

Revisé el bytecode generado usando dis y son idénticos.
Entonces, ¿por qué permitir esto en absoluto? ¿Alguna vez necesitaría uno de estos en lugar de los otros?

Un caso cuando necesita incluir más estructura en el lado izquierdo de la asignación es cuando le pide a Python que descomprima una secuencia un poco más complicada. P.ej:

 # Works >>> a, (b, c) = [1, [2, 3]] # Does not work >>> a, b, c = [1, [2, 3]] Traceback (most recent call last): File "", line 1, in  ValueError: need more than 2 values to unpack 

Esto me ha resultado útil en el pasado, por ejemplo, cuando se usa enumerar para iterar sobre una secuencia de 2 tuplas. Algo como:

 >>> d = { 'a': 'x', 'b': 'y', 'c': 'z' } >>> for i, (key, value) in enumerate(d.iteritems()): ... print (i, key, value) (0, 'a', 'x') (1, 'c', 'z') (2, 'b', 'y') 

Las tuplas de Python a menudo se pueden escribir con o sin los paréntesis:

 a = 1, 2, 3 

es equivalente a

 a = (1, 2, 3) 

En algunos casos, necesita paréntesis para resolver ambigüedades, por ejemplo, si desea pasar la tupla (1, 2) a la función f , tendrá que escribir f((1, 2)) . Debido a que los paréntesis a veces son necesarios, siempre se les permite consistencia, al igual que siempre se puede escribir (a + b) lugar de a + b .

Si desea descomprimir una secuencia anidada, también necesita paréntesis:

 a, (b, c) = 1, (2, 3) 

No parece haber una razón para permitir también los corchetes, y las personas rara vez lo hacen.

También son iguales porque la asignación se realiza de derecha a izquierda y, a la derecha, tiene un tipo, que es una secuencia de dos elementos. Cuando se realiza la llamada de asignación, la secuencia se desempaqueta y busca los elementos correspondientes para que coincidan y se asignen a esos valores. Sí, cualquier forma debe estar bien en este caso donde la secuencia se desempaqueta en los elementos respectivos.

Al desempaquetar un iterable de un solo elemento, la syntax de la lista es más bonita:

 a,=f() # comma looks out of place (a,)=f() # still odd [a]=f() # looks like every other list 

Un paréntesis abierto permite una asignación multilínea. Por ejemplo, cuando se lee una fila de csv.reader() , hace que el código sea más legible (si es menos eficiente) para cargar la lista en las variables nombradas con una sola asignación.

Comenzar con un paréntesis evita líneas largas o \ escapadas.

(a, b, c) = [1, 2, 3]

(Imagina nombres de variables más y más largos)