簡體   English   中英

Python list.index 在找不到索引時拋出異常

[英]Python list.index throws exception when index not found

為什么 list.index 會拋出異常,而不是使用任意值(例如-1 )? 這背后的想法是什么?

對我來說,處理特殊值而不是異常看起來更干凈。

編輯:我沒有意識到-1是一個潛在的有效值。 盡管如此,為什么不做其他事情呢? None 的值怎么樣?

因為-1本身就是一個有效的索引。 它可以使用不同的值,例如None ,但這沒有用, -1可以在其他情況下(因此str.find() ),並且僅相當於錯誤檢查,這正是異常是給。

補充一下 Devin 的回答:這是特殊返回值與異常之間的老爭論。 許多編程大師更喜歡異常,因為在出現異常時,我可以看到整個堆棧跟蹤並立即推斷出什么是錯誤的。

好吧,特殊值實際上必須是None ,因為 -1 是一個有效的索引(意味着列表的最后一個元素)。

您可以通過以下方式模擬此行為:

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

“異常值與錯誤值”的爭論部分是關於代碼清晰度的。 考慮帶有錯誤值的代碼:

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

在這種情況下,代碼量實際上是相同的,但主要算法沒有被錯誤處理破壞。

在 Python 中,-1 是一個有效索引,表示列表末尾的數字(而不是開頭),所以如果你要

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

然后你會得到數組的第一個值,而不是意識到有一個錯誤。 這樣你就可以捕獲異常並處理它。 如果您不想要異常,則只需事先檢查:

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

編輯:返回 None 沒有任何意義,因為如果您要測試 None,您不妨測試該值是否在上面的列表中!

主要是為了確保盡快發現錯誤。 例如,考慮以下情況:

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

您會注意到,如果 index 返回 None,則會在l[x]而不是x = l.index("foo")處引發錯誤。 在這個例子中,這並不是什么大問題。 但是想象一下,第三行在百萬行程序中的某個完全不同的地方。 這可能會導致一些調試噩夢。

我同意 Devin Jeanpierre 的觀點,並補充說在小例子中處理特殊值可能看起來不錯,但是(除了一些值得注意的例外,例如 FPU 中的 NaN 和 SQL 中的 Null)它幾乎沒有擴展。 它唯一有效的地方是:

  • 你通常有很多嵌套的同構處理(例如數學或 SQL)
  • 你不關心區分錯誤類型
  • 你不在乎錯誤發生在哪里
  • 這些操作是純函數,沒有副作用。
  • 失敗可以在更高級別賦予合理的含義(例如“沒有匹配的行”)
def GetListIndex(list, searchString):
    try:
        return list.index(searchString)

    except ValueError:
        return False

    except Exception:
        raise

一個簡單的想法: -1完全可以用作索引(與其他負值一樣)。

這是一個語義論證。 如果你想知道一個元素的索引,你就聲稱它已經存在於列表中。 如果你想知道它是否存在,你應該使用in

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM