2016-07-05 40 views
6

Capisco quello che l'operatore in fa in questo codice:Python 'in' parola chiave nell'espressione vs. nel ciclo for

some_list = [1, 2, 3, 4, 5] 
print(2 in some_list) 

ho anche capisco che i assumerà ogni valore della lista in questo codice :

for i in [1, 2, 3, 4, 5]: 
    print(i) 

io sono curioso di sapere se l'operatore in utilizzato nel ciclo for è lo stesso che l'operatore in utilizzata nel primo codice.

+2

Duplicato o correlato: http://stackoverflow.com/q/25573715/1639625 –

+1

'in' e' for..in' sono due costrutti di linguaggio diversi. – deceze

risposta

11

Sono lo stesso concetto ma non gli stessi operatori.

Nell'esempio print(2 in some_list), in è un operatore che gestisce diverse situazioni. Il Python docs for the in operator fornisce i dettagli: x in y chiamate y.__contains__(x) se ha una funzione membro __contains__. Altrimenti, x in y tenta di iterare tramite y.__iter__() per trovare x o chiama y.__getitem__(x) se __iter__ non esiste. La complessità consiste nel fornire test di appartenenza coerenti per codice meno recente e codice più recente — __contains__ è ciò che si desidera se si stanno implementando le proprie classi.

Nel ciclo for, in è solo un indicatore che separa la variabile dell'indice del ciclo da qualunque cosa si sta eseguendo il ciclo. Il Python docs for the for loop discute la semantica: qualsiasi cosa venga dopo in viene valutata all'inizio di un ciclo per fornire un iteratore. Il corpo del loop viene quindi eseguito per ciascun elemento dell'iteratore (escluso break o altre modifiche al flusso di controllo). L'istruzione for non si preoccupa di __contains__ o __getitem__.

Modifica @Kelvin rende un buon punto: è possibile modificare il comportamento del in rispetto alle proprie classi di nuovo stile (class foo(object)):

+1

upvote perché è possibile modificare il comportamento del primo tipo di 'in' definendo' __contains__' –

+0

Il modo in cui è formulato implica che l'operatore e le parole chiave sono cose separate anche se direi che è quasi la stessa o che gli operatori sono anche parola chiave. – syntonym

+0

@syntonym risolto - grazie :) – cxw

0

No, non è lo stesso. Il test in come nel tuo primo esempio è un test per l'appartenenza e restituisce un valore di verità. Questo in potrebbe essere considerato come l'analogo sequenziale di == o is (a seconda di come è implementato __contains__).

Il in nel secondo esempio fa parte della grammatica di iterazione; lega temporaneamente la variabile selezionata i a ciascun elemento nel iterabile. Questo in potrebbe essere considerato l'analogo sequenziale di =, l'operatore di assegnazione.

0

No, anche se entrambi usano la stessa parola, fanno cose diverse. in è in entrambi i casi una struttura di sintassi, ad es. non è un nome di un oggetto e non può essere cambiato. È possibile vedere here e here la definizione sintattica di ciascuno. Come puoi vedere i nomi sono hardcoded e non hanno alcuna relazione.