Python list.index выдает исключение, когда индекс не найден

Да, это правильное / ожидаемое поведение:

  • strpos может возвращать 0, когда есть совпадение в начале строки
  • , и это вернет false, когда нет совпадения

. Дело в том, что вы не должны использовать == для сравнения 0 и false; вы должны использовать ===, например:

if(strpos("abcdefghijklmnop","http://www.") === 0) {

}

Или:

if(strpos("abcdefghijklmnop","http://www.") === false) {

}

Для получения дополнительной информации см. Операторы сравнения :

  • $a == $b будет TRUE, если $a равно $b.
  • $a === $b будет TRUE, если $a равно $b ], и они одного типа.

И, цитируя страницу руководства strpos :

Это функция может возвращать Boolean FALSE, но может также возвращать небулевое значение, которое оценивается как FALSE, например 0 или "". Подробнее читайте в разделе Booleans . Используйте оператор === для проверки возвращаемого значения этой функции.

blockquote>

13
задан dreftymac 19 September 2017 в 04:08
поделиться

9 ответов

Поскольку -1 самостоятельно допустимый индекс. Это могло использовать другое значение, такой как None, но это не было бы полезно, который -1 может быть в других ситуациях (таким образом str.find()), и составил бы просто проверку ошибок, которая является точно, для чего исключения.

13
ответ дан 1 December 2019 в 07:19
поделиться

Добавить к ответу Devin: Это - старые дебаты между специальными возвращаемыми значениями по сравнению с исключениями. Многие гуру программирования предпочитают исключение, потому что на исключении, я добираюсь, чтобы видеть, что целые stacktrace и непосредственный выводят что не так.

8
ответ дан 1 December 2019 в 07:19
поделиться

Ну, специальное значение должно было бы на самом деле быть None, потому что-1 допустимый индекс (значение последнего элемента списка).

Можно эмулировать это поведение:

idx = l.index(x) if x in l else None
7
ответ дан 1 December 2019 в 07:19
поделиться

"Дебаты" значения исключения по сравнению с ошибкой частично о ясности кода. Рассмотрите код с ошибочным значением:

idx = sequence.index(x)
if idx == ERROR:
    # do error processing
else:
    print '%s occurred at position %s.' % (x, idx)

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

try:
    idx = sequence.index(x)
    print '%s occurred at position %s.' % (x, idx)
except IndexError:
    # do error processing

В этом случае объем кода является эффективно тем же, но основной алгоритм не повреждается обработкой ошибок.

4
ответ дан 1 December 2019 в 07:19
поделиться

В Python,-1 допустимый индекс, означая число от конца списка (вместо начала), поэтому если необходимо было сделать

idx = mylist.index(someval)
nextval = mylist[idx+1]

затем Вы получили бы первое значение массива, вместо того, чтобы понять, что была ошибка. Таким образом, можно поймать исключение и соглашение с ним. Если Вы не хотите исключения, то просто проверяют заранее:

if someval in mylist:
    idx = mylist.index(someval)

Править: Нет действительно никакой точки в возврате Ни одного, потому что, если Вы собираетесь не протестировать ни на Один, Вы могли бы также протестировать, является ли значение в списке как выше!

2
ответ дан 1 December 2019 в 07:19
поделиться

Это должно главным образом гарантировать, что ошибки фиксируются как можно скорее. Например, рассмотрите следующее:

l = [1, 2, 3]
x = l.index("foo")  #normally, this will raise an error
l[x]  #However, if line 2 returned None, it would error here

Вы заметите, что ошибка бросить в l[x] вместо в x = l.index("foo") если индекс не должен был возвращать Ни один. В этом примере это не действительно грандиозное предприятие. Но предположите, что третья строка находится в некотором совершенно другом месте в программе миллионлайн. Это может привести к определенному кошмару отладки.

2
ответ дан 1 December 2019 в 07:19
поделиться

Я соглашаюсь с Devin Jeanpierre и добавил бы, что контакт со специальными значениями может выглядеть хорошим в маленьких случаях в качестве примера, но (с несколькими существенными исключениями, например, NaN в FPUs и Пустым указателем в SQL) он не масштабируется почти также. Единственное время это работает, то, где:

  • Вы обычно получали большую вложенную гомогенную обработку (например, математика или SQL)
  • Вы не заботитесь о различении ошибочных типов
  • Вы не заботитесь, где ошибка произошла
  • Операции являются чистыми функциями без побочных эффектов.
  • Отказу можно дать разумное значение в более высоком уровне (например, "Никакие строки, подобранные")
1
ответ дан 1 December 2019 в 07:19
поделиться

Одна простая идея: -1 совершенно применимо как индекс (как другие отрицательные величины).

0
ответ дан 1 December 2019 в 07:19
поделиться

Это - семантический аргумент. Если Вы хотите знать индекс элемента, Вы утверждаете, что он уже существует в списке. Если Вы хотите знать, существует ли это, необходимо использовать in.

0
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

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