2013-03-18 15 views
8

Rozumiem, że somelist[len(somelist)] nie może uzyskać dostępu do indeksu znajdującego się poza zdefiniowaną listą - ma to sens.Dlaczego somelist [len (somelist)] generuje IndexError, ale nie somelist [len (somelist):]?

Ale dlaczego więc Python pozwala na wykonanie somelist[len(somelist):]?

mam nawet przeczytać, że somelist[len(somelist):] = [1] jest równoważna somelist.append(1)

ale dlaczego notacja plaster zmienia to faktu, że wskaźnik „DŁ (jakaśLista)” jest wciąż poza zasięgiem liście?

Odpowiedz

4

Oto coś z documentation. Istnieją określone zasady dotyczące krojenia dowolnych iterowalnych; Szczególnie godne uwagi jest # 4, kopalnia nacisk:

Kawałek s od i do j jest zdefiniowany jako sekwencję elementów z indeksu k takie, że i <= k < j. Jeśli i lub j jest większa niż len(s), użyj len(s). Jeśli pominięto i lub None, użyj 0. Jeśli pominięto j lub None, użyj len(s). Jeśli wartość i jest większa lub równa j, wycinek jest pusty.

+0

OK, to wyjaśnia, dlaczego zwrócono pustą listę (jak wskazali inni). Ale dlaczego 'somelist [len (somelist):] = [1]' pozwala ci dołączyć 1 do somelist? Czy nie jest odpowiednikiem poprzedniego polecenia tylko '[] = [1]'? Przepraszam, nie próbuję być gęsty. –

+0

Jeśli 'i'> =' j', plasterek jest pusty (obecnie nie ma żadnych elementów), ale nie jest pustym obiektem listy; nadal jest to kawałek rozpoczynający się od 'i', a przypisanie do niego listy usuwa jego bieżące pozycje (nie ma żadnych) z listy i wstawia pozycje na przypisanej liście w pozycji' i'. – rakslice

+0

Załóżmy na przykład, że ustawiłem 'x = range (5)', a następnie przypisuję plaster 'x [3: 2] = [8,7,6]', 'x' będzie teraz' [0, 1, 2, 8, 7, 6, 3, 4] ". To ta sama sytuacja; nie ma nic szczególnego w przydziale plasterków w przypadku 'i' =' len (s) '. – rakslice

1

Nie ma nic w indeksie len(somelist) (indeksy listy zaczynają się od 0 w pythonie). Dlatego próba dostępu do nieistniejącego elementu powoduje błąd.

Jednak podzielenie listy (ze składnią myList[i:]) zwraca nową listę zawierającą elementy, w tym i po i. Ponieważ nie istnieją żadne elementy na liście w indeksie i (lub po), pusta lista jest zwracany

+0

@AlexKrycek: Tak. Przypisywanie do plasterka to nie to samo, co czytanie fragmentu. – BrenBarn

1

Od the Python docs:

zdegenerowane indeksy slice są obsługiwane wdzięcznie: indeks, który jest zbyt duży zastępuje rozmiar łańcucha, górna granica mniejsza niż dolna granica zwraca pusty ciąg znaków.

więc indeks> Rozmiar lista jest automatycznie korygowana, a somelist[len(somelist):] zwraca elementy po ostatniej, tj nada.