TLDR;В выражении индекса индекс должен быть меньше длины, а в выражении среза длина является допустимым индексом.
В выражении индекса индекс должен быть в диапазоне , иначе это паника.Индекс находится в диапазоне, если 0 <= i < length
.Цитирование из спецификации:
В индексном выражении a[x]
...
Если a
не карта:
- индекс
x
находится в диапазоне, если 0 <= x < len(a)
, в противном случае оно выходит за пределы диапазона
И:
Для a тип строки :
Ваша строковая переменная str
хранит значение string
, которое содержит один байт: 'a'
.Индексирование начинается с нуля, так что отдельный байт имеет индекс 0
.Его длина равна 1
, поэтому элемент с индексом 1
отсутствует.
В выражении среза :
a[low : high]
Для массивов или строк индексы находятся в диапазоне, если 0 <= low <= high <= len(a)
,в противном случае они выходят за пределы диапазона.
В выражении среза длина является допустимым индексом.Так что в вашем случае индексация str
, как str[1:]
, приведет к пустой строке: ""
:
В выражении среза a[low : high]
...
Результатимеет индексы, начинающиеся с 0
и длиной, равной high - low
.
Отсутствующий индекс low
по умолчанию равен нулю;отсутствующий индекс high
по умолчанию равен длине нарезанного операнда.
Таким образом, str[1:]
совпадает с str[1:len(str)]
, равным str[1:1]
.Результирующая строка будет иметь длину high - low = 1 - 1 = 0
: пустое string
.