Si supponga di avere una lista di tuple che assomiglia a questo:
L = [(1,2), (3,4), (5,6)]
Si supponga di voler stampare questi tuple in qualche modo speciale:
for tup in L:
a = tup[0]
b = tup[1]
if a<b:
print a,b
else:
print b,a
Ma assegnando lo a
e b
esplicitamente di essere il contenuto di tup
è piuttosto noioso. Così si potrebbe fare questo:
for tup in L:
a,b = tup
if a<b:
print a,b
else:
print b,a
Ma si potrebbe rendere ancora meno noioso:
for (a,b) in L: # you could also do "for [a,b] in L"
if a<b:
print a,b
else:
print b,a
Qui, (a,b)
modello corrisponde contro l'elemento che viene restituito dalla iterazione. Nella prima esecuzione del ciclo for, l'elemento viene restituito per iterazione è (1,2)
, che ottiene modello confrontato (a,b)
, che assegna quindi 1
-a
e 2
-b
Ora, nel primo esempio, si effettua l'iterazione una lista contenente una lista vuota. Ciò significa che stai tentando di stampare tutti gli 0
s in quanto ci sono []
s in questo elenco. Ma è un po 'più complesso di quello:
Quando si tenta di eseguire lo schema come nel mio terzo esempio, python esegue iterazioni sull'elenco (o tupla) di variabili e l'elemento restituito dall'iteratore, assegnando simultaneamente i valori mentre partire. Quindi, quando il tuo pattern non contiene variabili, anche l'elemento con cui stai cercando pattern match dovrebbe essere vuoto (e iterabile). Questo spiega il seguente comportamento:
>>> 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
... e questo comportamento troppo:
>>> 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
Ora, come per il secondo esempio, l'operazione [:]
crea sostanzialmente una copia della lista viene chiamato, in modo che la modifica dell'elenco originale non altera la copia e 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
Quindi, quando si chiamano [][:]
, tutto quello che stai facendo sta facendo un nuovo elenco vuoto, che funziona allo stesso modo la mia spiegazione per il primo esempio
google per la sequenza disimballaggio. Dovrebbe spiegarlo. – hendrik