2012-08-03 24 views
5

Sono nuovo con Python (con Java come base). Ho letto i libri Dive Into Python, nel capitolo 3 ho trovato su Multi-Variable Assignment. Forse alcuni di voi mi può aiutare a capire che cosa succede in questo codice sotto:Comprensione insufficiente delle assegnazioni multi-variabili 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 ] 

Quello che ho capito finora è la #1 e #2 ha stessa uscita, che mostra i valori della tupla. #3 visualizza la chiave di tupla e #4 visualizza solo l'ultima chiave dall'elenco di tuple.

non capisco l'uso della variabile a e variabile b per ogni caso di cui sopra:

  1. a for b, a ... -> visualizzare i valori
  2. a for a, a ... -> visualizzare i valori
  3. a for a, b ... - > visualizza i tasti
  4. a for b, b ... -> visualizza l'ultima chiave

Qualcuno può elaborare il flusso del ciclo per ogni caso sopra?

+0

Qual è la tua domanda? – jtbandes

+0

Voglio capire a cosa serve la variabile 'a' e' b' in # 1, # 2, # 3 e # 4. – Crazenezz

+0

Di quale/i confuso/a? – dghubble

risposta

8

La lista di comprensione si utilizza lì all'incirca tradurre come segue:

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

diventa

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

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

diventa

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()] 

diventa

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

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

diventa

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

Quest'ultimo è speciale. Funzionava solo perché hai usato la variabile a in una dichiarazione precedente e l'ultimo valore che gli era stato assegnato era 3. Se esegui questa istruzione per prima, otterrai un errore.

6

In tutti e quattro i casi, i nomi nella tupla sono associati a ciascuno degli elementi nella coppia dalla sequenza nell'ordine. La quarta istanza è un esempio di comportamento (errato) in Python 2.x; il nome è lasciato legato all'ultimo oggetto che aveva, anche al di fuori del LC. Questo comportamento è stato risolto in 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

Buona nota circa 2.x "perdite" LC vars –

3

Una tupla è solo un insieme di variabili.Ottieni queste coppie quando chiami

params.items() 

come ti sei scritto nei commenti.

per disfare una tupla tutto quello che dovete fare è questo:

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

Lo stesso avviene quando si utilizza list comprehension.

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

qui a tira fuori il primo elemento della tupla per ogni tupla nell'elenco. Questo è il n. 1 nel tuo caso usando la lista params al posto della mia short list.

Se invece si scrive

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

si ottiene il secondo elemento. Questo corrisponde al tuo # 3.

Gli altri due non hanno davvero senso. In # 2 hai

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

che consente solo un essere prima il primo e poi direttamente sovrascrive con il secondo argomento in ogni disimballaggio. Puoi vedere che succede la stessa cosa con la singola tupla.

L'ultimo n. 4 è semplicemente strizzato. Se non avessi già usato una variabile come questa non avrebbe funzionato dal momento che allora non esiste.

>>> [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 

Spero che questo risponda alle vostre domande.

Problemi correlati