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 такую примитивщину, которая не должна лагать? Может проблема как раз в том, что ошибка вылетает когда много потоков одновременно пытаются получить доступ к элементу общего списка?
  • Вопрос задан
  • 5821 просмотр
Пригласить эксперта
Ответы на вопрос 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]

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

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

Войти через центр авторизации
Похожие вопросы