2016-04-28 24 views
7

Quando affettare in pitone, omettendo la porzione end della sezione (cioè l'estremità in list[:end:]) Risultati in end essendo definito come "la dimensione della stringa essere affettato." *Perché lista [:: - 1] non uguale lista [: len (lista): - 1]?

Tuttavia, questo non sembra essere vero quando si utilizza l'argomento step (la passo in list[::step]) in una fetta, almeno quando l'argomento è step-1. Un semplice esempio:

>>> l = [1, 2, 3] 
>>> l[::-1] 
[3, 2, 1] 
>>> l[:len(l):-1] 
[] 

Ciò indica che nel caso di un argomento step essere passato, un valore end omessa è non equivalente esplicitamente passando la dimensione dell'oggetto essere affettato.

Forse questo è solo un mio fallimento nella lettura della documentazione, ma mi piacerebbe capire perché il mio esempio sopra sembra contraddire la documentazione di Python sull'omissione di valori end a fette, e idealmente dove questo diverso è documentato.


* Slice indices have useful defaults; an omitted first index defaults to zero, an omitted second index defaults to the size of the string being sliced.

+3

'l [len (l) :: - 1]' è '[3, 2, 1]'. L'inizio è la fine quando vai indietro. –

+0

l'arresto è ora impostato sul terzo indice, quando la stringa viene invertita dal passo -1, l'arresto viene immediatamente raggiunto. Ecco perché restituisce una lista vuota –

+2

L'estratto della documentazione è errato. Si applica solo quando il passo è positivo. Di fatto, non esiste un valore intero corrispondente al valore predefinito per l'indice stop quando il passo è -1, poiché sarebbe logicamente pari a -1, tranne che ha un significato speciale per Python. Devi usare 'Nessuno' per ottenere l'indice desiderato. È un difetto nella notazione della fetta. –

risposta

6

La documentazione a cui si fa riferimento è il tutorial, che fornisce solo una panoramica informale della sintassi e della semantica di Python. Non spiega tutti i dettagli. Noterai che la pagina del tutorial a cui ti sei collegato non parla nemmeno degli indici negativi.

La documentazione effettiva è riportata nel riferimento della libreria sequence types. Anche se è un po 'stringato e non facile da capire su una prima lettura, lo fa chiarire che per una fetta [i:j:k]:

Se i o j vengono omessi o Nessuno, diventano “fine” valori (che fine dipende sul segno di k).

+0

perfetto, questo è esattamente quello che stavo cercando. Non ero stato in grado di trovare la documentazione esplicitamente spiegando che 'i' e' j' sono capovolti a seconda del segno di 'k'. Suppongo che chiedere un tutorial introduttivo per un linguaggio preciso sia irragionevole, anche se sfortunatamente il tutorial è l'unica documentazione ufficiale che emerge quando google "python slicing" –

+0

Dice che diventano "valori finali" a seconda del segno di k. Ma quali sono questi valori finali? Quali sono i valori finali quando k è positivo e cosa sono quando sono negativi? –

+0

@AsadMoosvi: Questo è spiegato nella stessa documentazione: "Se i o j è maggiore di len (s), usa len (s). Se i è omesso o Nessuno, usa 0. Se j è omesso o Nessuno, usa len (S)."È solo che la mappatura di i/j su None/len (s) può cambiare se il passo è negativo. – BrenBarn

2

l[::-1] è la stessa cosa di l.__getitem__(slice(None, None, -1)). Poiché l'inizio e l'arresto sono entrambi None, l'elenco verrà spostato da un'estremità all'altra. L'argomento step determina la direzione e il passo.

Problemi correlati