Python list.index在找不到索引时抛出异常

时间:2009-03-23 16:58:07

标签: python indexing list

为什么list.index抛出异常而不是使用任意值(例如-1)?这背后的想法是什么?

对我来说,处理特殊值而不是例外情况看起来更清晰。

编辑:我没有意识到-1是一个潜在有效的值。不过,为什么不是别的呢?无价值怎么样?

10 个答案:

答案 0 :(得分:12)

因为-1本身就是一个有效的索引。它可以使用不同的值,例如None,但这没有用,-1可能在其他情况下(因此str.find()),并且仅仅是错误 - 检查,这正是例外情况。

答案 1 :(得分:7)

添加Devin的回复:这是特殊回报值与异常之间的旧争论。许多编程专家更喜欢异常,因为在异常情况下,我会看到整个堆栈跟踪并立即推断出错误。

答案 2 :(得分:6)

嗯,特殊值实际上必须是 None ,因为-1是有效索引(表示列表的最后一个元素)。

您可以通过以下方式模拟此行为:

idx = l.index(x) if x in l else None

答案 3 :(得分:4)

“异常与错误价值”的争论部分是关于代码清晰度。考虑具有错误值的代码:

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 :(得分:2)

在Python中,-1是一个有效的索引,意思是列表末尾(而不是开头)的数字,所以如果你要这样做

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

然后你会得到数组的第一个值,而不是意识到有错误。这样你就可以捕获异常并处理它。如果您不想要例外,那么请事先检查:

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

编辑:返回None没有任何意义,因为如果您要测试None,您还可以测试该值是否在上面的列表中!

答案 5 :(得分:2)

主要是为了确保尽快发现错误。例如,请考虑以下事项:

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

如果索引返回None,您会注意到l[x]而不是x = l.index("foo")会抛出错误。在这个例子中,这并不是什么大不了的事。但想象一下,第三行在一百万行程序中处于完全不同的地方。这可能导致一些调试噩梦。

答案 6 :(得分:1)

我同意Devin Jeanpierre的观点,并补充说,在小例子情况下处理特殊值可能看起来不错,但是(除了一些值得注意的例外,例如FPU中的NaN和SQL中的Null)它几乎不能扩展。它唯一有效的时间是:

  • 您通常会进行大量嵌套的同类处理(例如数学或SQL)
  • 您不关心区分错误类型
  • 您不关心错误发生的位置
  • 操作是纯函数,没有副作用。
  • 失败可以在更高级别给出合理的含义(例如“没有匹配的行”)

答案 7 :(得分:0)

一个简单的想法:-1完全可用作索引(与其他负值一样)。

答案 8 :(得分:0)

这是一个语义论证。如果您想知道元素的索引,则声明它已存在于列表中。如果您想知道它是否存在,您应该使用in

答案 9 :(得分:0)

def GetListIndex(list, searchString):
    try:
        return list.index(searchString)

    except ValueError:
        return False

    except Exception:
        raise