Ви праві! 'example'[3:4]
і 'example'[3]
принципово різні, і нарізка поза межами послідовності (принаймні для вбудованих) не викликає помилки.
Спочатку це може бути дивно, але це має сенс, коли ти задумаєшся. Індексація повертає один елемент, але нарізка повертає послідовність елементів. Отже, коли ви намагаєтесь індексувати неіснуюче значення, повернути немає чого. Але коли ви нарізаєте послідовність поза межами, ви все одно можете повернути порожню послідовність.
Частково бентежить тут те, що рядки поводяться дещо інакше, ніж списки. Подивіться, що відбувається, коли ви робите те саме у списку:
>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]
Тут різниця очевидна. У випадку рядків результати виявляються однаковими, оскільки в Python немає такого поняття, як окремий символ поза рядком. Окремий символ - це лише 1-символьний рядок.
(Точну семантику нарізки поза діапазоном послідовності див. У відповіді Мгільсона .)
[999:9999]
не є індексом, це зріз і має різну семантику. З вступу python: "Вироджені індекси зрізів обробляються витончено: завеликий індекс замінюється розміром рядка, верхня межа менша за нижню межу повертає порожній рядок."