Что касается нотации фрагмента Python

Эта строка кода

print [0, 1, 2, 3, 4][0:1:1]

возвращает [0].

Однако следующая строка кода:

print [0, 1, 2, 3, 4][0:0:1]

возвращает [].

Почему это? Основываясь на этой пояснении фрагмента Python, я понимаю, что формат должен быть:

a[start:end:step] # start through not past end, by step

Так что не стоит [0, 1, 2, 3, 4][0:0:1] начинать и заканчивать с 0-м значением, возвращая тем самым [0]?

Ответ 1

Индекс "конца" среза всегда исключается из результата; т.е. listy[start:end] возвращает все listy[i], где start <= i < end (обратите внимание на использование < вместо <=). Поскольку числа i нет, так что 0 <= i < 0, listy[0:0:anything] всегда будет пустым списком (или ошибкой).

Ответ 2

Конечный индекс в нотации фрагмента Python является исключительным. Кусочек [n:m] будет возвращать каждый элемент с индексом >= n и < м.

Чтобы немного упростить, попробуйте его без шага (что не обязательно, когда значение шага равно 1):

>>> a = [0, 1, 2, 3, 4]
>>> a[0:1]
[0]
>>> a[0:0]
[]

Как правило, количество элементов в срезе равно значению начала среза минус индекс конца фрагмента. I., срез [n:m] вернет m-n элементов. Это согласуется с одним элементом (1-0), возвращаемым [0:1], и нулевыми элементами (0-0), возвращаемыми [0:0].

(Обратите внимание, что это неверно, если любой из индексов среза находится вне размера массива.)

Для хорошей визуализации того, как работают индексы среза, найдите "Один способ запомнить, как работают срезы" в http://docs.python.org/2/tutorial/introduction.html

Ответ 3

Обратите внимание, что [0:0:1] not [0:1:1]

Итак:

start = 0
end = 0
step = 1

Срез [start:end:step] означает, что он вернет значения, находящиеся между start и end - 1, с определенным step, поэтому для вашего примера:

...[0:0:1]

Значения между 0 и -1, поэтому он ничего не возвращает.