2015-01-22 14 views
37

The Python tutorial spiega il comportamento delle porzioni quando gli indici sono negativi, ma non riesco a trovare la documentazione che descrive il comportamento quando l'indice finale precede l'indice iniziale. (Ho anche guardato Explain Python's slice notation, e forse non sto leggendo abbastanza attentamente, ma le risposte non sembrano risolvere questo punto.)La lista [i: j] è garantita come una lista vuota se la lista [j] precede la lista [i]?

Il comportamento che osservo è che viene restituita una lista vuota, che mi sembra ragionevole. Tuttavia, mi sembra ragionevole anche che restituisca un elenco di articoli tra i e j in ordine inverso o semplicemente sollevando un'eccezione.

Is list[i:j] garantiti per essere una lista vuota se list[j] precede list[i]?

risposta

44

Sì, se j <= i è true, la sezione risultante è vuota, per tipi di Python standard . Per ottenere i risultati in ordine inverso, è necessario aggiungere un passo negativo:

list[i:j:-1] 

perché esplicito è meglio che implicita.

Questo è documentato in Common Sequence Operations, nota 4:

La fetta di s da i a j è definita come la sequenza di elementi con indice k tale che i <= k < j. Se i o j è maggiore di len(s), utilizzare len(s). Se i è omesso o None, utilizzare 0. Se j viene omesso o None, utilizzare len(s). Se i è maggiore o uguale a j, la sezione è vuota.

Bold enfasi miniera.

I tipi personalizzati sono liberi di interpretarlo in modo diverso.

+1

Ah, * questo * dove è menzionato nella documentazione di Python. Esattamente quello che stavo cercando. – jamesdlin

+0

Cosa intendi con il corsivo "per i tipi standard di Python"? – inf

+2

@bamboon: la gestione delle sezioni è specifica del tipo. I tipi 'list',' tuple', 'str',' bytes' e 'range' si comportano tutti allo stesso modo, ma se si implementa il proprio tipo il metodo' __getitem__' è libero di gestire fette in modo diverso. –

Problemi correlati