Załóżmy, że masz listę krotek, który wygląda tak:
L = [(1,2), (3,4), (5,6)]
Załóżmy, że chcesz wydrukować te krotki w jakiś szczególny sposób:
for tup in L:
a = tup[0]
b = tup[1]
if a<b:
print a,b
else:
print b,a
Ale przypisywania a
i b
wyraźnie się zawartość tup
jest raczej żmudna. Więc może to zrobić:
for tup in L:
a,b = tup
if a<b:
print a,b
else:
print b,a
Ale można zrobić to nawet mniej uciążliwe:
for (a,b) in L: # you could also do "for [a,b] in L"
if a<b:
print a,b
else:
print b,a
Tutaj (a,b)
wzorzec pasuje do elementu, który jest zwracany przez iteracji. W pierwszym wykonaniu pętli for element zwracane przez iteracji jest (1,2)
, który dostaje wzór pasujący przeciwko (a,b)
, który w związku z tym przypisuje 1
do a
i 2
do b
Teraz, w pierwszym przykładzie, jesteś iteracji nad lista zawierająca pustą listę. Oznacza to, że próbujesz wydrukować jak najwięcej 0
s, ponieważ na tej liście znajdują się []
. Ale jest to nieco bardziej skomplikowane:
Kiedy próbujesz dopasować do wzorca, jak w moim trzecim przykładzie, python iteruje na liście (lub krotce) zmiennych i element zwracany przez iterator, jednocześnie przypisując wartości udać się. Jeśli więc twój wzorzec nie zawiera zmiennych, to element, który próbujesz dopasować do wzoru, powinien być również pusty (i iterowalny). To wyjaśnia następujące zachowanie:
>>> 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
... i to zachowanie TOO:
>>> 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
Teraz, gdy za drugim przykładzie, operacja [:]
zasadzie tworzy kopię listy jest wywoływana, więc zmiana oryginalnej listy nie zmienia kopii i odwrotnie:
>>> 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
Więc kiedy zadzwonisz [][:]
, wszystko robisz czyni nową listę pustą, który działa tak samo jak moje wyjaśnienia za pierwszym przykładzie
google sekwencja rozpakowaniu. Powinien to wyjaśnić. – hendrik