簡體   English   中英

Python索引背后的邏輯

[英]Logic behind Python indexing

我在Python很好奇為什么x[0]中檢索的第一個元素xx[-1]以相反的順序讀取時檢索第一個元素。 語法似乎與我不一致,因為在一種情況下我們計算距離第一個元素的距離,而我們在向后讀取時不計算距離最后一個元素的距離。 不會像x[-0]更有意義嗎? 我有一個想法是Python中的區間通常被認為是相對於下限的包容性但是對於上限是獨占的,因此索引可以被解釋為距下限或上限元素的距離。 關於為何選擇這種符號的任何想法? (我也很好奇為什么零索引是首選。)

Dijkstra 在這里簡要描述了基於零的索引的情況。 另一方面,您必須考慮如何計算Python數組索引。 首先計算數組索引:

x = arr[index]

將首先解析並計算index ,並且-0顯然計算為0 ,使用arr[-0]指示最后一個元素是不可能的。

y = -0 (??)
x = arr[y]

幾乎沒有意義。

編輯:

我們來看看以下函數:

def test():
    y = x[-1]

假設x已在全局范圍內聲明。 現在讓我們來看看字節碼:

          0 LOAD_GLOBAL              0 (x)
          3 LOAD_CONST               1 (-1)
          6 BINARY_SUBSCR
          7 STORE_FAST               0 (y)
         10 LOAD_CONST               0 (None)
         13 RETURN_VALUE

基本上,全局常量x (更准確地說是它的地址)被壓入堆棧。 然后評估數組索引並將其推送到堆棧上。 然后執行TOS = TOS1[TOS]的指令BINARY_SUBSCR (其中TOS表示Top of Stack )。 然后堆棧的頂部彈出到變量y

由於BINARY_SUBSCR處理負數組索引,並且-0在被推送到堆棧頂部之前將被計算為0 ,因此需要對解釋器進行重大更改(以及不必要的更改)以使arr[-0]指示最后一個數組的元素。

其主要原因有以下幾點:

  • 計算機使用基於0的數字
  • 較舊的編程語言使用基於0的索引,因為它們是低級的並且更接近機器代碼
  • 較新的高級語言使用它來保持一致性和相同的原因

有關更多信息,請訪問: https//en.wikipedia.org/wiki/Zero-based_numbering#Usage_in_programming_languages

在使用基於0的索引但沒有將負索引實現為python的許多其他語言中,要訪問列表(數組)的最后一個元素,需要查找列表的長度並為最后一個元素減去1,如下所示:

items[len(items) - 1]

在python中, len(items)部分可以簡單地省略,支持負索引,考慮:

>>> items = list(range(10))
>>> items[len(items) - 1]
9
>>> items[-1]
9

在python: 0 == -0 ,所以x[0] == x[-0]

為什么序列索引為零而不是基於索引? 這是語言設計師應該做的選擇。 我所知道的大多數語言都使用基於0的索引。 Xpath使用1作為選擇。

使用否定索引也是該語言的慣例。 不知道為什么選擇它,但它允許通過對索引進行簡單的加法(減法)來循環或循環序列。

暫無
暫無

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

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