[英]Logic behind Python indexing
我在Python很好奇為什么x[0]
中檢索的第一個元素x
而x[-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]
指示最后一個數組的元素。
其主要原因有以下幾點:
有關更多信息,請訪問: 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.