Задать вопрос
Kommov
@Kommov

Почему в Python вылетает ошибка IndexError: list index out of range, при правильном коде?

Есть элементарная часть кода, которая кидает в переменную рандомный элемент из списка. Такого плана:
...
text_list = ['text1', 'text2', 'text3', 'text4']
get_text = random.choice(text_list)
...
И далее работаем с этой переменной. Список text_list - нигде не изменяется. По индексам обращений нет. И именно на строке get_text =.. часто стала вылетать ошибка IndexError: list index out of range. Ума не приложу, как такое возможно? Большую часть времени код работает без нареканий, но иногда как будто питон с ума начинает сходить - на всех random.choice начинает вылетать индекс эррор (списки все неизменяемые и локальные!). Единственный момент, - код работает в многопотоке, потоков больше 1к. Но переменная локальная для каждого объекта. Может кто-нибудь предположить из за чего это, и как этого избежать? Не оборачивать же в try except такую примитивщину, которая не должна лагать? Может проблема как раз в том, что ошибка вылетает когда много потоков одновременно пытаются получить доступ к элементу общего списка?
  • Вопрос задан
  • 5877 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@bbkmzzzz
random.choice выкидывает исключение, если последовательность пустая.

исходник random.choice

def choice(self, seq):
        """Choose a random element from a non-empty sequence."""
        try:
            i = self._randbelow(len(seq))
        except ValueError:
            raise IndexError('Cannot choose from an empty sequence') from None
        return seq[i]

Вот и обращение по индексу, а для генерации рандомного числа берет длину последовательности. Смотрите, почему список пуст или недоступен, если он разделяемый ресурс.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы