Ответ 1
Обозначение фрагмента "[a: b: c]" означает "подсчет с шагом c
начиная с a
включительно, до b
exclusive". Если c
отрицательный, вы считаете обратное, если оно опущено, оно равно 1. Если a
опущено, вы начинаете как можно дальше в направлении, в котором вы рассчитываете (чтобы начало, если c
было положительным, и конец, если отрицательный). Если b
опущено, вы заканчиваете как можно дальше в направлении, в котором вы рассчитываете (так что конец, если c
положителен, а начало - отрицательным). Если a
или b
отрицательно, это означает смещение от конца (-1, являющегося последним символом) вместо начала.
ОК, поэтому string[0::-1]
- это один символ, он говорит: "Считайте обратную сторону от индекса 0 насколько это возможно". Насколько это возможно, это начало строки.
string[0:len(string):-1]
или, если на то пошло, string[0:anything:-1]
тонко отличается. Он пуст по той же причине, что string[1:0]
пуст. Назначенный конец среза не может быть достигнут с самого начала. Вы можете подумать об этом, поскольку срез закончился "раньше", и он начал (следовательно, пуст), или вы можете думать, что конечная точка автоматически настраивается так, чтобы она была равна начальной точке (следовательно, срез пуст).
string[:len(string):-1]
означает "отсчет назад от конца до, но не включая индекс len(string)
". Этот индекс не может быть достигнут, поэтому срез пуст.
Вы не пробовали string[:0:-1]
, но это означает "отсчет назад от конца до, но не включая индекс 0". Так что все, кроме первого символа, обращаются вспять. [:0:-1]
соответствует [::-1]
, поскольку [0:len(string)-1]
соответствует [:]
. В обоих случаях исключенный конец среза является индексом, который был бы включенным последним символом среза с опущенным концом.
Вы также не пробовали string[-1::-1]
, что совпадает с string[::-1]
, потому что -1
означает последний символ строки.