2013-03-18 17 views
8

Capisco che somelist[len(somelist)] non possa accedere a un indice che si trova al di fuori dell'elenco definito - questo ha senso.Perché il somelist [len (somelist)] genera un errore IndexError ma non un somelist [len (somelist):]?

Ma perché Python ti permette di fare somelist[len(somelist):]?

Ho anche letto che somelist[len(somelist):] = [1] equivale a somelist.append(1)

Ma perché fetta notazione cambia il fatto che l'indice "len (somelist)" è ancora al di fuori della gamma di lista?

risposta

4

Ecco qualcosa dallo documentation. Esistono regole specifiche sull'affinamento di qualsiasi iterabile; Di particolare nota è # 4, sottolineatura mia:

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 viene omesso o None, utilizzare 0. Se j viene omesso o None, utilizzare len(s). Se i è maggiore o uguale a j, la sezione è vuota.

+0

Ok, questo spiega perché viene restituita una lista vuota (come altri hanno sottolineato). Ma perché 'somelist [len (somelist):] = [1]' ti consente di aggiungere 1 al somelist? L'equivalente del comando precedente non è solo '[] = [1]'? Mi scuso, non sto cercando di essere denso. –

+0

Se 'i'> =' j', la sezione è vuota (al momento non ci sono articoli) ma non è un oggetto elenco vuoto; è ancora una sezione che inizia con 'i', e assegnandole una lista rimuove gli elementi correnti (non ce ne sono) dall'elenco e inserisce gli elementi nell'elenco assegnato in posizione' i'. – rakslice

+0

Ad esempio, supponiamo di aver impostato 'x = range (5)', e quindi di assegnare la porzione 'x [3: 2] = [8,7,6]', 'x' sarà ora' [0, 1, 2, 8, 7, 6, 3, 4] '. Questa è la stessa situazione; non c'è nulla di speciale nell'assegnazione delle slice nel caso 'i' =' len (s) '. – rakslice

1

Non c'è niente all'indice len(somelist) (gli indici di elenco iniziano da 0 in python). Pertanto, provare ad accedere a un elemento non esistente solleva un errore.

Tuttavia, l'elenco delle sezioni (con la sintassi myList[i:]) restituisce un nuovo elenco contenente gli elementi incluso e dopo i. Poiché non vi sono elementi nell'elenco all'indice i (o dopo), un elenco vuoto viene restituito

+0

@AlexKrycek: Sì. Assegnare ad una fetta non è la stessa cosa che basta leggere la fetta. – BrenBarn

1

Da the Python docs:

indici di fetta degeneri vengono gestiti con eleganza: un indice che è troppo grande, è sostituito dal la dimensione della stringa, un limite superiore più piccolo del limite inferiore restituisce una stringa vuota.

Così un indice> dimensione elenco è corretto automaticamente e somelist[len(somelist):] restituisce gli elementi dopo l'ultimo, cioè nada.