TypeError для обозначения среза str[a:b]
tl; dr: используйте двоеточие :
вместо запятой междудва индекса a
и b
в str[a:b]
При работе с строками и обозначением среза ( общая операция последовательности), может случиться так, что TypeError
будет поднят, указывая, что индексы должны быть целыми числами, даже если они, очевидно, являются.
Пример
>>> my_string = "hello world"
>>> my_string[0,5]
TypeError: string indices must be integers
Мы, очевидно, прошлидва целых числа для индексов для обозначения среза, верно?Так в чем здесь проблема?
Эта ошибка может быть очень неприятной - особенно в начале изучения Python - потому что сообщение об ошибке немного вводит в заблуждение.
Объяснение
Мы неявно передали кортеж из двух целых чисел (0 и 5) в нотацию среза, когда мы вызвали my_string[0,5]
, потому что 0,5
(даже без скобок) оценивает тот же кортеж, что и (0,5)
do.
Запятую ,
на самом деле достаточно для Python, чтобы оценить что-то как кортеж:
>>> my_variable = 0,
>>> type(my_variable)
<class 'tuple'>
Итак, что мы сделали там, на этот раз явно:
>>> my_string = "hello world"
>>> my_tuple = 0, 5
>>> my_string[my_tuple]
TypeError: string indices must be integers
Теперь, по крайней мере, сообщение об ошибке имеет смысл.
Решение
Нам нужно заменить запятую ,
на двоеточие :
для правильного разделения двух целых чисел:
>>> my_string = "hello world"
>>> my_string[0:5]
'hello'
Более четкое и полезное сообщение об ошибке могло выглядеть примерно так:
TypeError: string indices must be integers (not tuple)
Хорошее сообщение об ошибке показывает пользователя напрямуючто они сделали неправильно, и это было бы болееочень как решить проблему.
[Поэтому в следующий раз, когда вы обнаружите себя ответственным за написание сообщения с описанием ошибки, подумайте об этом примере и добавьте причину или другую полезную информацию в сообщение об ошибке, чтобы позволить вам и другим людям понять, что пошло не так.]
Извлеченные уроки
- Для обозначения фрагмента используются двоеточия
:
для разделения его индексов (и диапазон шагов, например, str[from:to:step]
) - кортежи определяются запятыми
,
(например, t = 1,
) - добавить некоторую информацию в сообщения об ошибках для пользователей, чтобы понять, что пошло не так
Приветствия и счастливое программирование
winklerrr
[Я знаю, что на этот вопрос уже был дан ответ, и это был не совсем тот вопрос, который задал автор темы, но я пришел сюда из-за вышеуказанной проблемы, которая приводит к тому же сообщению об ошибке.По крайней мере, мне понадобилось некоторое время, чтобы найти эту маленькую опечатку.
Так что я надеюсь, что это поможет кому-то еще, кто наткнулся на ту же ошибку и сэкономит им некоторое время, обнаружив эту крошечную ошибку.]