Про срезы в python написано много. Синтаксис среза [start:end:step]
при положительном шаге понятен интуитивно и почти не требует объяснений
Возьмем для примера простой список: x = [1,2,3,4,5]
. Дефолтный срез с положительным шагом для создания полной копии списка будет выглядеть так: x[::]
и для x аналогичен такому коду: x[0:5:1]
, проверим:
print (x[0:5:1])
Вывод:
[1, 2, 3, 4, 5]
Ничего сложного. Матчасть гласит, что при отрицательном шаге срез создается с зада наперед:
print (x[::-1])
[5, 4, 3, 2, 1]
Все просто. И большинство мануалов на этой прекрасной ноте заканчивают повествование о такой замечательной конструкции языка, видимо, полагая, что все остальное должно быть просто очевидно
И очевидно, что x[0:5:-1]
вроде как должно вывести полную копию x, и если вы запустите в редакторе, то получите на выходе пустой список. Почему? Гуру многочисленных форумов, как правило, отписываются общими фразами типа «считать нужно в обратном направлении» и точка. Складывается впечатление, они сами не знают, как их готовить. Их можно понять. На самом деле такая конструкция, как срез с отрицательным шагом востребована достаточно редко, ведь конструкция обычного среза с положительным более, чем избыточна.
Но ради спортивного интереса я решил докопаться до истины. В своем поиске я обнаружил, что конструкция x[::-1]
идентична x[-1:-1-len(x):-1]
. То есть в нашем случае запись x[::-1] == x[-1:-6:-1]
Вывод:
[5, 4, 3, 2, 1]
Что же обозначает start в этой конструкции?
Удивитесь, но start = 0
в этом случае будет означать то же самое, что и -1
при положительном шаге среза. Соответственно start=1
будет соответствовать -2
и так далее, например:
print (x[1::-1])
равно, как и print (x[1:-6:-1])
выведет
[2, 1]
-
то есть два последних элемента среза списка [5, 4, 3, 2, 1]
, как при -2
положительного шага.
Хорошо, со start разобрались. Что же с end? End=0
при отрицательном срезе так же идентичен -1
при положительном шаге среза, например:
print (x[:0:-1])
Выведет
[5, 4, 3, 2]
Соответственно -1
будет идентичен 0
, -2==1
и так далее. Быть может, это кому-то и кажется очевидным, но …на мой взгляд, это требует, как минимум, вот такой вот отдельной статьи.
Всем удачи