2012-08-03 12 views
5

Jestem nowy w Pythonie (z Javą jako podstawową). Czytałem książki Dive Into Python, w rozdziale 3 znalazłem około Multi-Variable Assignment. Może ktoś z was może mi pomóc zrozumieć, co się stało w tym kodzie poniżej:Brak zrozumienia zadań wielowymiarowych Python

>>> params = {1:'a', 2:'b', 3:'c'} 
>>> params.items() # To display list of tuples of the form (key, value). 
[(1, 'a'), (2, 'b'), (3, 'c')] 

>>> [a for b, a in params.items()] #1 
['a', 'b', 'c'] 
>>> [a for a, a in params.items()] #2 
['a', 'b', 'c'] 
>>> [a for a, b in params.items()] #3 
[ 1 , 2 , 3 ] 
>>> [a for b, b in params.items()] #4 
[ 3 , 3 , 3 ] 

Co rozumiem jakim jest #1 i #2 ma taką samą moc, która wyświetla wartości krotki. #3 wyświetla klucz krotki, a #4 wyświetla tylko ostatni klucz z listy krotek.

Nie rozumiem użycie zmiennej a i zmiennym b dla każdego przypadku powyżej:

  1. a for b, a ... -> Wyświetlanie wartości
  2. a for a, a ... -> wyświetla wartości
  3. a for a, b ... - > wyświetl klawisze
  4. a for b, b ... -> wyświetl ostatni klucz

Czy każdy może rozwinąć przepływ pętli dla każdego przypadku powyżej?

+0

Jakie jest twoje pytanie? – jtbandes

+0

Chcę zrozumieć, jaki jest pożytek z zmiennych 'a' i' b' w # 1, # 2, # 3 i # 4. – Crazenezz

+0

Którego (-ych) dotyczy problem? – dghubble

Odpowiedz

8

Lista rozumienie skorzystać tam z grubsza przetłumaczyć następująco:

[a for b, a in params.items()] 

staje

result = [] 
for item in params.items(): 
    b = item[0] 
    a = item[1] 
    result.append(a) 

[a for a, a in params.items()] 

staje

result = [] 
for item in params.items(): 
    a = item[0] 
    a = item[1] # overwrites previous value of a, hence this yields values, 
       # not keys 
    result.append(a) 

[a for a, b in params.items()] 

staje

result = [] 
for item in params.items(): 
    a = item[0] 
    b = item[1] 
    result.append(a) 

[a for b, b in params.items()] 

staje

result = [] 
for item in params.items(): 
    b = item[0] 
    b = item[1] 
    result.append(a) # note use of a here, which was not assigned 

Ta ostatnia jest wyjątkowy. To zadziałało tylko dlatego, że w poprzedniej instrukcji użyto zmiennej a, a ostatnią wartością, która została do niej przypisana, była 3. Jeśli wykonasz to polecenie w pierwszej kolejności, pojawi się błąd.

6

We wszystkich czterech przypadkach nazwy w krotce są przypisane do każdego z elementów pary z kolejności w kolejności. Czwarta instancja jest przykładem (niewłaściwego) zachowania w Pythonie 2.x; nazwa jest związana z ostatnim obiektem, nawet poza LC. To zachowanie zostało naprawione w 3.x.

>>> [x for x in (1, 2, 3)] 
[1, 2, 3] 
>>> x 
3 

3>> [x for x in (1, 2, 3)] 
[1, 2, 3] 
3>> x 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'x' is not defined 
+1

Dobra uwaga na temat 2.x "przeciekających" LC vars –

3

Krotka to po prostu pakowanie zmiennych razem.Otrzymasz te pary, gdy wywołasz

params.items() 

tak, jak zapisałeś się w komentarzach.

Aby rozpakować krotka wszystko co musisz zrobić to:

>>> a, b = (2, 3) 
>>> a 
2 
>>> b 
3 

To samo odbywa się podczas korzystania listowych.

>>> [a for a, b in [(2, 3), (4, 5)]] 
[2, 4] 

tutaj a wyjmuje pierwszy element krotki dla każdej krotki na liście. To jest # 1 w twoim przypadku, używając listy parametrów zamiast mojej krótkiej listy.

Jeśli zamiast pisać

>>> [b for a, b in [(2, 3), (4, 5)]] 
[3, 5] 

pojawi się drugi element. Odpowiada to twojemu # 3.

Dwa pozostałe nie mają większego sensu. W # 2 masz

>>> [a for a, a in [(2, 3), (4, 5)]] 
[3, 5] 
>>> a,a = (2,3) 
>>> a 
3 

który właśnie umożliwia a będzie pierwszy, a potem bezpośrednio nadpisuje go z drugiego argumentu w każdym rozpakowaniu. Możesz zrobić to samo z pojedynczą krotką.

Ostatnie # 4 jest po prostu wykręcane. Gdybyś już nie używał zmiennej jako zmiennej, to by nie działało, skoro nie istnieje.

>>> [a for b, b in [(2, 3), (4, 5)]] 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
NameError: name 'a' is not defined 

Mam nadzieję, że to odpowie na twoje pytania.

Powiązane problemy