# Объяснение ошибки IndexError в Python: индекс списка выходит за пределы допустимого диапазона

В этом руководстве вы узнаете все о ошибке выхода за пределы списка в Python, включая то, что это такое, почему она возникает и как ее исправить.

`IndexError` - одна из самых распространенных ошибок времени выполнения в Python, с которыми вы столкнетесь в своем программировании. По большей части эти ошибки довольно легко исправить, как только вы поймете, почему они возникают.

В этом руководстве вы узнаете, почему возникает ошибка, и рассмотрите некоторые сценарии, в которых вы можете с ней столкнуться. Вы также **узнаете, как устранить ошибку в этих сценариях**

Оглавление



* [Что такое индексная ошибка Python?](#chto-takoe-indeksnaya-oshibka-python)
* [Индексная ошибка Python с циклом For](#indeksnaya-oshibka-python-s-ciklom-for)
* [Ошибка индекса Python с циклом while](#oshibka-indeksa-python-s-ciklom-while)
* [Как исправить ошибку индексации Python](#kak-ispravit-oshibku-indeksirovaniya-python)
  * [Но что, если вам нужно получить доступ к индексу списка?](#no-chto-esli-vam-nuzhno-poluchit-dostup-k-indeksu-spiska)
* [Заключение](#zaklyuchenie)

### Что такое индексная ошибка Python?

Давайте уделим немного времени исследованию ошибки `IndexError` в Python и посмотрим, как она выглядит. Когда вы столкнетесь с этой ошибкой, вы увидите следующее сообщение об ошибке:

```
IndexError: list index out of range
```

Мы можем немного разобрать текст. Мы видим здесь, что сообщение сообщает нам, что индекс **вне диапазона**. Это означает, что мы пытаемся получить доступ к элементу списка в Python, который находится вне диапазона, что значит, что элемент не имеет позиции индекса.

**Элемента, у которого нет индексной позиции в списке Python, попросту не существует.**

В Python, как и во многих других языках программирования, индекс списка начинается с позиции `0` и продолжается до `n-1`, где n — это длина списка (или количество элементов в этом списке).

Это вызывает довольно распространенную ошибку. Предположим, мы работаем со списком из 4 элементов. Если мы захотим получить доступ к четвертому элементу, вы можете попробовать использовать индекс 4. Однако это вызовет ошибку. Это потому, что четвертый элемент на самом деле имеет индекс 3.

Давайте посмотрим на пример списка и попробуем получить доступ к элементу, который не существует:

```python
# How to raise an IndexError
a_list = ['welcome', 'to', 'datagy']
print(a_list[3])

# Returns:
# IndexError: list index out of range
```

Можно заметить, что ошибка индексации возникает на последнем элементе, к которому мы пытаемся получить доступ.

**Самое простое решение - просто не пытаться получить доступ к несуществующему элементу**. Но это легче сказать, чем сделать. Как предотвратить возникновение `IndexError`? В следующих двух разделах вы узнаете, как предотвратить эту ошибку в наиболее распространенных ситуациях: циклах for в Python и циклах while в Python.

**Хотите проверить, существует ли ключ в словаре Python?** Ознакомьтесь с [этим руководством](https://datagy.io/python-check-if-key-value-dictionary/), которое обучает пяти различным способам проверки существования ключа в словаре Python, включая возврат значения по умолчанию.

### Индексная ошибка Python с циклом For

Вы можете столкнуться с ошибкой `IndexError` в Python при выполнении цикла for. Это особенно часто происходит, когда вы пытаетесь проитерировать список, используя [`range()`](https://datagy.io/python-range/)

Давайте рассмотрим ситуацию, в которой возникает эта ошибка:

```
# How to raise an IndexError with a For Loop
a_list = ['welcome', 'to', 'datagy']

for i in range(len(a_list) + 1):
    print(a_list[i])

# Returns:
# welcome
# to
# datagy
# Traceback (most recent call last):
# IndexError: list index out of range
```

Способ исправить эту ошибку заключается в том, чтобы **прекратить итерацию до того, как список исчерпает свои элементы**. Для этого изменим наш цикл for, чтобы он проходил до длины списка, а не до длины + 1. Это позволит нам прекратить итерацию по индексам списка до достижения значения длины.

Это решает проблему `IndexError`, поскольку приводит к остановке итерации списка на позиции `length - 1`, так как наш индекс начинается с 0, а не с 1.

Давайте посмотрим, как мы можем изменить код, чтобы он работал правильно:

```
# How to prevent an IndexError with a For Loop
a_list = ['welcome', 'to', 'datagy']

for i in range(len(a_list)):
    print(a_list[i])

# Returns:
# welcome
# to
# datagy
```

Теперь, когда вы поняли, как устранить ошибку `IndexError` в цикле for на Python, давайте посмотрим, как можно устранить эту ошибку в цикле while.

### Ошибка индекса Python с циклом while

Вы также можете столкнуться с ошибкой `IndexError` в Python при выполнении цикла

Например, может возникнуть соблазн использовать цикл while для прохода по каждому индексу списка. Вы можете, например, написать программу, которая выглядит следующим образом:

```python
# How to raise an IndexError with a While Loop
a_list = ['welcome', 'to', 'datagy']

i = 0
while i <= len(a_list):
    print(a_list[i])
    i += 1

# Returns:
# welcome
# to
# datagy
# IndexError: list index out of range
```

Причина, по которой эта программа не работает, заключается в том, что мы проходим по списку на один раз больше, чем нужно. Это происходит потому, что мы используем `<=` (знак "меньше или равно"). Поскольку индексы списков в Python начинаются с 0, их максимальный индекс равен количеству элементов в списке минус 1.

Мы можем решить эту проблему, просто изменив оператор на символ "меньше", `<`. Это предотвратит выход индекса за пределы диапазона в цикле.

```python
# How to prevent an IndexError with a While Loop
a_list = ['welcome', 'to', 'datagy']

i = 0
while i < len(a_list):
    print(a_list[i])
    i += 1

# Returns:
# welcome
# to
# datagy
```

В следующем разделе вы узнаете лучший способ перебора списка в Python, чтобы предотвратить ошибку `IndexError`.

**Хотите узнать больше о f-строках в Python?** Ознакомьтесь с [моим подробным руководством](https://datagy.io/python-f-strings/), которое включает пошаговое видео для освоения f-строк в Python!

### Как исправить ошибку индексирования Python

Есть два простых способа обойтись без ошибки `IndexError` при итерации по списку в Python.

Первый способ — очень простой способ перебора списка. Нам не обязательно _нужен_ индекс для итерации по списку. Мы можем просто получать доступ к его элементам напрямую.

```python
# Prevent an IndexError
a_list = ['welcome', 'to', 'datagy']

for word in a_list:
    print(word)

# Returns:
# welcome
# to
# datagy
```

Это напрямую предотвращает выход Python за пределы максимального индекса.

**Хотите узнать, как использовать функцию Python `zip()` для перебора двух списков?** [Этот урок](https://datagy.io/python-zip-lists/) расскажет вам, что именно делает функция `zip()` и покажет несколько творческих способов её использования.

#### Но что, если вам нужно получить доступ к индексу списка?

Если вам нужно получить доступ к индексу списка и элементу списка, то гораздо более безопасной альтернативой является использование функции Python `enumerate()`

При передаче списка в функцию `enumerate()` возвращается объект enumerate. Это позволяет получить как индекс, так и элемент для каждого элемента списка. Функция неявно останавливается на максимальном индексе, но позволяет получить достаточно много информации.

Давайте посмотрим, как мы можем использовать функцию `enumerate()`, чтобы предотвратить ошибку `IndexError` в Python.

```python
# Prevent an IndexError with enumerate()
a_list = ['welcome', 'to', 'datagy']

for idx, word in enumerate(a_list):
    print(idx, word)

# Returns:
# 0 welcome
# 1 to
# 2 datagy
```

Здесь видно, что цикл останавливается до того, как индекс выходит за пределы диапазона, тем самым предотвращая ошибку Python `IndexError`.

### Заключение

В этом уроке вы узнали, как понять ошибку Python `IndexError`: list item out of range. Вы узнали, почему возникает эта ошибка, включая некоторые общие сценарии, такие как циклы for и while. Вы также узнали более правильные способы итерации по списку Python, например, итерацию по элементам неявно, а также использование функции Python `enumerate()`

Чтобы узнать больше о Python `IndexError`, ознакомьтесь [с официальной документацией здесь](https://docs.python.org/3/library/exceptions.html?highlight=indexerror#IndexError)
