Что такое индекс в массиве
Что проверяют
Понимаете ли вы, почему обращение по индексу стоит одинаково для первого и для миллионного элемента. Вопрос простой, и потому ценится модель памяти, а не умение написать обращение к нулевому элементу.
Как отвечать
Индекс это смещение элемента от начала последовательности, а не его имя. Адрес считается арифметикой: начало плюс номер, умноженный на размер ячейки. Поэтому доступ занимает константное время, а нумерация начинается с нуля: у первого элемента смещение нулевое.
В Python под словом «массив» обычно имеют в виду список, и тут стоит уточнить устройство. Список это динамический массив указателей на объекты: подряд лежат ссылки одинакового размера, а сами значения разбросаны по куче. Отрицательный индекс это сахар, интерпретатор прибавляет длину.
xs = [10, 20, 30]
xs[0], xs[-1] # 10 и 30, минус один это len(xs) - 1
xs[5] # IndexError
xs[5:9] # пустой список, срез не падаетПолезно назвать соседей: array.array и массивы numpy хранят сами значения подряд, без указателей, поэтому занимают меньше памяти и дружелюбнее к кэшу процессора.
Где спотыкаются
Забывают, что срез не проверяет границы так же, как обращение по одному индексу: обращение к несуществующему элементу падает сразу, а срез за концом молча отдаёт пустой список. Ошибка уезжает дальше по коду и всплывает в другом месте.
Считают список массивом чисел и ждут от него экономии памяти. Каждое число это отдельный объект со своим заголовком, список хранит только ссылки, и на больших числовых данных разница с numpy получается кратной.
Говорят про константный доступ и сразу же приписывают ту же дешевизну вставке. Вставка и удаление в начало сдвигают весь хвост, это линейная стоимость; для очереди берут deque, а не список.