Suponga que tiene una lista de tuplas que tiene este aspecto:
L = [(1,2), (3,4), (5,6)]
Supongamos que desea imprimir estas tuplas de una forma especial:
for tup in L:
a = tup[0]
b = tup[1]
if a<b:
print a,b
else:
print b,a
Pero la asignación de a
y b
explícitamente como el contenido de tup
es bastante tedioso. Así que es posible hacer esto:
for tup in L:
a,b = tup
if a<b:
print a,b
else:
print b,a
Pero podría hacerlo aún menos tedioso:
for (a,b) in L: # you could also do "for [a,b] in L"
if a<b:
print a,b
else:
print b,a
Aquí, (a,b)
patrón coincide con el elemento que se devuelve por la iteración. En la primera ejecución del bucle, el elemento que se devuelve por iteración es (1,2)
, que recibe el patrón emparejado contra (a,b)
, que por lo tanto asigna 1
-a
y 2
-b
Ahora, en su primer ejemplo, que está interactuando sobre una lista que contiene una lista vacía. Esto significa que está intentando imprimir tantos 0
s como hay []
s en esta lista. Pero es un poco más complejo que eso:
Cuando intenta hacer coincidir patrones como en mi tercer ejemplo, python itera sobre la lista (o tupla) de variables y el elemento devuelto por el iterador, al mismo tiempo, asignando valores a medida que ir. Entonces, cuando su patrón no contiene variables, entonces el elemento con el que está tratando de emparejar el patrón también debe estar vacío (e iterable). Esto explica el siguiente comportamiento:
>>> for i in 5: print i
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> for [] in [[], 5]: print 0
...
0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
... y este comportamiento también:
>>> x,y = (2,5,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> for [] in [[], [5]]: print 0
...
0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
Ahora, en cuanto a su segundo ejemplo, la operación [:]
, básicamente, crea una copia de la lista se invoca, de modo que alterar la lista original no altera la copia y viceversa:
>>> L = [1,2,3]
>>> M = L
>>> M[0] = 'a'
>>> print L[0]
'a'
>>> L = [1,2,3]
>>> M = L[:]
>>> M[0] = 'a'
>>> print L[0]
1
Así que cuando se llama a [][:]
, todo lo que está haciendo es hacer una nueva lista vacía, que funciona igual que mi explicación para su primer ejemplo
Google para la secuencia de desempacar. Debería explicarlo. – hendrik