Этот «трюк» является просто частным случаем применения операции среза к последовательности. Вы можете использовать его для создания обратной копии списка или кортежа. Еще один «трюк» из того же семейства: [:]
часто используется для создания (мелкой) копии списка.
«Что нового в Python 2.3» - неожиданная точка входа в лабиринт. Давайте начнем с более очевидного (?) Места, текущей документации 2.X для объектов последовательности .
В таблице операций последовательности вы увидите строку с Operation = s [i: j: k], Result = "фрагмент s из i в j с шагом k" и Notes = "(3) (5)».
Примечание 3 говорит: «Если i или j отрицательны, индекс относится к концу строки: подставляется len (s) + i или len (s) + j. Но обратите внимание, что -0 по-прежнему равно 0. «
В примечании 5 говорится: «Срез s от i до j с шагом k определяется как последовательность элементов с индексом x = i + n * k, такой что 0 <= n <(ji) / k. Другими словами , индексы i, i + k, i + 2 * k, i + 3 * k и т. д., остановка при достижении j (но не включая j). Если i или j больше len (s), используйте len (s). Если i или j опущены или отсутствуют, они становятся «конечными» значениями (конец которых зависит от знака k). Обратите внимание, что k не может быть равным нулю. Если k равно None, оно рассматривается как 1. </p>
У нас есть k == -1, поэтому используются следующие индексы: i, i-1, i-2, i-3 и т. Д., Останавливаясь при достижении j (но никогда не включая j). Чтобы получить наблюдаемый эффект, «конечное» значение, используемое для i, должно быть len(s)-1
, а «конечное» значение, используемое для j, должно быть -1. Таким образом, используются индексы last, last-1, ..., 2, 1.
Еще одна точка входа - рассмотреть, как мы можем получить такой результат для любой последовательности, если [::-1]
не существует в языке:
def reverse_traversal_of_sequence(s):
for x in range(len(s) - 1, -1, -1):
do_something_with(s[x])