2016-07-10 3 views
2

Я имею дело с нарезкой Python, и я столкнулся с неожиданными результатами.Определено ли это поведение нарезки?

Пример:

print([1, 2, 3][0:-4:-1]) 

Возвращает [1]

print([1, 2, 3][0:-3:-1]) 
print([1, 2, 3][0:-2:-1]) 
print([1, 2, 3][0:-1:-1]) 

Каждый из этих деклараций [] (как ожидалось).

Как это происходит?

Спасибо, Reyha24.

+0

Вы спрашиваете только о первом примере? – zondo

+0

@zondo: Да. Остальные мне понятны. – Reyha24

+0

Это определенное поведение. Он похож на '[1, 2, 3] [2: 3]', просто переходя назад, а не вперед. – user2357112

ответ

2

В slice первый элемент (старт) включен. Второй аргумент (стоп) - ex clusive. Когда задана остановка -3, это означает, что нужно перейти от 1, к 1. Поскольку stop является исключительным, это исключает единственный элемент, и результат пуст. Когда задано значение -2, оно преобразуется в индекс 1. Как только будет указан индекс 0, вы уже передали индекс 1, потому что шаг отрицательный. Поэтому результат пуст. Вы получаете что-то похожее с -1. Однако взятие -4 с конца становится -1, потому что в списке всего три элемента. Возможно переход от 0 до -1 с отрицательным шагом: индекс 0 включен, индекс -1 не потому, что он появляется позже в списке.

+0

Спасибо, зондо. Ваш ответ велик! Кажется, я что-то перепутал. Можете ли вы рассказать мне, как другие три примера доходят до их результатов? Потому что, если я следую этому правилу, элемент в индексе 0 должен быть включен, правильно? – Reyha24

+1

@ Reyha24: Очень хорошая точка. Думаю, я тоже неправильно понял. См. Мой отредактированный ответ. – zondo

+0

Вы и TheBackCat дали мне понять. Большое спасибо! – Reyha24

1

Я думаю, что это яснее, если вы отмените срез и конвертируете в обычное индексирование. Поскольку python использует полуоткрытые интервалы, [0:-4:-1] преобразует в [1, 2, 3][-3:1]. -3 в этом случае соответствует индексу 0, поэтому он преобразуется в [1, 2, 3][0:1], который является только первым элементом. Второй случай, [0:-3:-1], преобразуется в [-2:1], то есть [1:1], который пуст. Третий случай преобразуется в [2:1] и т. Д.

+0

Хороший ответ! Я понял. Хорошего дня! – Reyha24

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