2014-01-31 2 views
-1

В Python мне интересно, почему срезы работают так, как они делают. Почему Guido van Rossum определил a[start:end], чтобы включить a[start], но неa[end], или как в заголовке, почему a[0:1] содержит только первый элемент, а не первые два?Поведение нарезания и индексации диапазона Python

Это похоже на шаг назад от поведения индексации MATLAB.

EDIT: Причина, по которой я задал этот вопрос, заключается в том, что это путано, что a[0:0] пуст. Но я не разрабатывал популярный язык, так что я знаю.

+1

Потому что не включая конечный индекс, аккуратно подходит для индексации на основе 0. 'range (10)' производит индексы от 0 до 9, нарезка с 'sequence [: len (sequence)]' работает и т. д. –

+0

Я отмечаю, что MATLAB использует индексирование на основе 1, что означает, что индексирование закрытого конца делает некоторые смысл. Однако вы не получите симпатичный 'a == a [: end] + [end:]' инвариант, который мы имеем в Python в MATLAB. –

ответ

5

Чтобы quote Гвидо ван Россум сам:

[...] Я качался элегантностью полуинтервалов. Особенно, что инвариант, когда два среза смежны, индекс первого фрагмента индекс - это индекс начала второго среза, который слишком красив, чтобы игнорировать. Например, предположим, что вы разделили строку на три части на индексы i и j - части будут [: i], [i: j] и [j:].

+0

Ahhh ... ладно, так что есть какой-то метод безумия :) – Andrew

+0

+1, вы должны добавить это на вопрос, что этот дубликат – jonrsharpe

+0

@jonrsharpe, хорошая идея. Готово! –

0

a[start:end-1] позволяет использовать a[0:len(a)].

И он подходит ко всем другим функциям, таким как range() и другие.

+0

Неужели вы всегда будете использовать '[:]' в этом сценарии? Но вопрос об использовании 'len (a)' как 'stop' действителен, например. для 'range'. – jonrsharpe

+0

@jonrsharpe Вы правы, но это всего лишь пример, который ему легко понять. – 1478963

0

Индексирование Python основано на 0. По исключая конечного значение, большинство нарезки и range() операций могут естественным образом отражать количества элементов нарезанных или производятся в том же время, включая индекс 0.

Таким образом, range(10) производит 10 элементов, от 0 до 9. Строгания к с sequence[:1] производит 1 элемент, индекс 0.

Кроме того, не включая индекс конца, это упрощает использование того же значения как начало для следующего раздела. Таким образом, sequence[:i] + sequence[i:] воссоздает sequence из двух срезов без необходимости корректировки i.

Смежные вопросы