为什么list.index抛出异常而不是使用任意值(例如-1
)?这背后的想法是什么?
对我来说,处理特殊值而不是例外情况看起来更清晰。
编辑:我没有意识到-1
是一个潜在有效的值。不过,为什么不是别的呢?无价值怎么样?
答案 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)它几乎不能扩展。它唯一有效的时间是:
答案 7 :(得分:0)
一个简单的想法:-1
完全可用作索引(与其他负值一样)。
答案 8 :(得分:0)
这是一个语义论证。如果您想知道元素的索引,则声明它已存在于列表中。如果您想知道它是否存在,您应该使用in
。
答案 9 :(得分:0)
def GetListIndex(list, searchString):
try:
return list.index(searchString)
except ValueError:
return False
except Exception:
raise