Часть вопроса относительно индексов вне диапазона
Логика среза автоматически обрезает индексы по длине последовательности.
Для удобства было сделано, чтобы индексы среза проходили мимо конечных точек.,Было бы больно иметь диапазон проверки каждого выражения, а затем настраивать пределы вручную, поэтому Python сделает это за вас.
Рассмотрим вариант использования, когда требуется отображать не более первых 50 символов текстаmessage.
Простой способ (что сейчас делает Python):
preview = msg[:50]
Или сложный способ (проверьте лимит самостоятельно):
n = len(msg)
preview = msg[:50] if n > 50 else msg
Реализация вручнуюэту логику для настройки конечных точек будет легко забыть, легко ошибиться (обновление 50 в двух местах), будет многословно и будет медленным.Python перемещает эту логику во внутренности, где она лаконична, автоматическая, быстрая и правильная.Это одна из причин, по которой я люблю Python: -)
Часть вопроса, касающаяся несоответствия длины назначений длине ввода
ОП также хотел знать обоснование для разрешения назначений, например p[20:100] = [7,8]
где цель назначения имеет другую длину (80), чем длина замещающих данных (2).
Проще всего увидеть мотивацию по аналогии со строками.Рассмотрим "five little monkeys".replace("little", "humongous")
.Обратите внимание, что у цели «маленький» есть только шесть букв, а у «огромных» - девять.Мы можем сделать то же самое со списками:
>>> s = list("five little monkeys")
>>> i = s.index('l')
>>> n = len('little')
>>> s[i : i+n ] = list("humongous")
>>> ''.join(s)
'five humongous monkeys'
Все это сводится к удобству.
До введения методов copy () и clear () , это были популярные идиомы:
s[:] = [] # clear a list
t = u[:] # copy a list
Дажетеперь мы используем это для обновления списков при фильтрации:
s[:] = [x for x in s if not math.isnan(x)] # filter-out NaN values
Надеюсь, что эти практические примеры дают хорошее представление о том, почему срез работает так, как он работает.