Вы правы, это [start:stop:step]
. Обратите внимание, что отрицательные пуски и остановки определены для начала в конце последовательности. Таким образом, для диапазона, который заканчивается значениями 2, 3, 4
, остановка -2
относится к 3
(-1 - последняя, -2 - вторая и последняя и т. Д.).
Итак, в вашем случае диапазон имеет длину 5, начиная с 0 и заканчивая на 4. Вы начинаете с индекса 4 и заканчиваетесь индексом -2, который составляет 5-2 = 3
. Так что пока индекс относится к [3, 4]
. Теперь, начиная с 4, у вас есть отрицательный шаг 2. Таким образом, вы пропустите 3, в результате получится всего лишь [4]
.
Если вы хотите [4, 2, 0]
, то вы должны выйти из стопа:
>>> range(5)[4::-2]
[4, 2, 0]
Вы можете на самом деле даже выйти из старта:
>>> range(5)[::-2]
[4, 2, 0]
но range(5)[4:-2]
результатов []
. Затем как range(5)[4:-2:-2]
результаты [4]
?
Срез оценивается сразу, а не один аргумент за другим:
После оценки отрицательного стоп, range(5)[4:-2]
эквивалентно range(5)[4:3]
. Поскольку указанного шага не указано, будет использоваться шаг по умолчанию для положительного 1. Это означает, что срез должен перейти от индекса 4 к индексу 3 с положительным шагом. Это невозможно, поэтому возвращается пустой список.
Если у нас есть отрицательный шаг, это выглядит так: range(5)[4:3:-2]
. Теперь, поскольку у нас есть отрицательный шаг, направление меняется на противоположное. Таким образом, мы можем начать с индекса 4 и перейти к более низкому индексу 3.
Это просто определено, что для положительного шага, stop >= start
должно быть правдой, а для отрицательного шага - обратным, stop <= start
.
. Тогда как я могу идти до отрицательного числа? – The6thSense
@VigneshKalai В диапазоне нет отрицательного числа. Если вам нужны отрицательные числа, вы не должны указывать «диапазон» для перехода от нуля к определенному (положительному) числу. – poke
Как @Shashank говорит, создайте этот 'list', передав правильные аргументы' range() ', а не пытаясь нарезать неправильный' list' в форму. – TigerhawkT3