Что на самом деле делает синтаксис расширенного среза для отрицательных шагов? [дубликат]

этот вопрос уже есть ответ здесь:

синтаксис расширенного среза в python был объяснен мне как"a[n:m:k] returns every kth element from n to m".

это дает мне хорошее представление о том, чего ожидать, когда k положительно. Но я теряюсь в том, как интерпретировать a[n:m:k] для отрицательный к. Я знаю это a[::-1] переворачивает а, и что a[::-k] принимает когда-либо K-й элемент перевернутого a.

но как это обобщение определений к положительным? Я хотел бы знать, как a[n:m:k] фактически определен, так что (например) я могу понять, почему:

"abcd"[-1:0:-1] = "dcb"

Is a[n:m:-k] реверсирование последовательности a, затем взятие элементов с исходными индексами, начиная с n и заканчивая одним перед m или чем-то еще? Я так не думаю, потому что это не так. установите другие значения n и m, которые я пробовал. Но я не могу понять, как это на самом деле определено, и поиск никуда меня не привел.

2 ответов


[-1:0:-1] означает: начните с индекса len(string)-1 и переехать в 0(не входит в комплект) и сделать шаг -1(реверс).

таким образом, извлекаются следующие индексы:

le-1, le-1-1, le-1-1-1  .... 1  # le is len(string)

пример:

In [24]: strs = 'foobar'

In [25]: le = len(strs)

In [26]: strs[-1:0:-1]  # the first -1 is equivalent to len(strs)-1

Out[26]: 'raboo'

In [27]: strs[le-1:0:-1]   
Out[27]: 'raboo'

документация Python (вот технический; объяснение range() немного легче понять) является более правильным, чем упрощенное объяснение "каждый K-й элемент". Параметры нарезки метко называются

slice[start:stop:step]

таким образом, срез начинается в месте, определенном start, останавливается перед расположении stop достигается и перемещается из одной позиции в другую по step предметы.