Masz rację! 'example'[3:4]
i 'example'[3]
są zasadniczo różne, a wycinanie poza granice sekwencji (przynajmniej w przypadku elementów wbudowanych) nie powoduje błędu.
Na początku może to być zaskakujące, ale ma sens, gdy się nad tym zastanowić. Indeksowanie zwraca pojedynczy element, ale wycinanie zwraca podciąg elementów. Więc kiedy próbujesz zindeksować nieistniejącą wartość, nie ma nic do zwrócenia. Ale kiedy wycinasz sekwencję poza granicami, nadal możesz zwrócić pustą sekwencję.
Część tego, co jest niejasne, polega na tym, że łańcuchy zachowują się nieco inaczej niż listy. Zobacz, co się dzieje, gdy robisz to samo z listą:
>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]
Tutaj różnica jest oczywista. W przypadku łańcuchów wyniki wyglądają na identyczne, ponieważ w Pythonie nie ma czegoś takiego jak pojedynczy znak poza łańcuchem. Pojedynczy znak to tylko 1-znakowy ciąg.
(Aby poznać dokładną semantykę wycinania poza zakresem sekwencji, zobacz odpowiedź mgilsona ).
[999:9999]
nie jest indeksem, to wycinek i ma inną semantykę. Z wprowadzenia do Pythona: „Zdegenerowane indeksy wycinków są obsługiwane z wdziękiem: indeks, który jest zbyt duży, jest zastępowany rozmiarem ciągu, a górna granica mniejsza niż dolna zwraca pusty ciąg”.