Подтвердить что ты не робот

Почему срезы подстроки с индексом вне диапазона работают?

Почему не 'example'[999:9999] приводит к ошибке? Поскольку 'example'[9] делает, какова мотивация этого?

Из этого поведения я могу предположить, что 'example'[3], по существу/внутри, не совпадает с 'example'[3:4], хотя оба результата приводят к той же строке 'm'.

4b9b3361

Ответ 1

Вы правы! 'example'[3:4] и 'example'[3] принципиально различаются, и вырезание за пределами последовательности (по крайней мере, для встроенных модулей) не вызывает ошибку.

Сначала это может быть удивительно, но имеет смысл, когда вы думаете об этом. Индексирование возвращает один элемент, а нарезка возвращает подпоследовательность элементов. Поэтому, когда вы пытаетесь проиндексировать несуществующее значение, возвращать нечего. Но когда вы нарезаете последовательность за пределами границ, вы все равно можете вернуть пустую последовательность.

Часть того, что сбивает с толку, заключается в том, что строки ведут себя немного иначе, чем списки. Посмотрите, что происходит, когда вы делаете то же самое со списком:

>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]

Здесь разница очевидна. В случае строк результаты кажутся идентичными, потому что в Python нет такой вещи, как отдельный символ вне строки. Один символ - это просто строка из 1 символа.

(Точную семантику среза вне диапазона последовательности см. В ответе mgilson.)

Ответ 2

Чтобы добавить ответ, который указывает на надежный раздел в документации:

Для выражения среза, такого как s[i:j:k],

Срез s от я до j с шагом k определяется как последовательность элементов с индексом x = я + n * k, такая, что 0 <= n < (J-я)/к. Другими словами, индексы i, я + k, я + 2 * k, я + 3 * k и т.д., Останавливаясь, когда j достигнуто (но никогда не включает j). Когда k положительно, я и j сведены к len (s), если они больше

если вы пишете s[999:9999], python возвращает s[len(s):len(s)] с len(s) < 999, и ваш шаг положителен (1 - значение по умолчанию).

Ответ 3

Нарезка не ограничена - проверяется встроенными типами. И хотя оба ваших примера, похоже, имеют одинаковый результат, они работают по-другому; попробуйте их со списком.