Что касается нотации фрагмента 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, поэтому он ничего не возвращает.