我在Python中很好奇为什么x[0]
检索x
的第一个元素,而x[-1]
以相反顺序读取时检索第一个元素。语法似乎与我不一致,因为在一种情况下我们计算距离第一个元素的距离,而我们在向后阅读时不计算距离最后一个元素的距离。不会像x[-0]
那样更有意义吗?我有一个想法是Python中的区间通常被认为是相对于下限的包容性但是对于上限是独占的,因此索引可以被解释为距下限或上限元素的距离。关于为何选择这种符号的任何想法? (我也很好奇为什么零索引是首选。)
答案 0 :(得分:4)
Dijkstra here简洁地描述了基于零的索引的情况。另一方面,您必须考虑如何计算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
(更准确地说是它的地址)被压入堆栈。然后评估数组索引并将其推送到堆栈上。然后执行BINARY_SUBSCR
的指令TOS = TOS1[TOS]
(其中TOS
表示Top of Stack
)。然后堆栈顶部弹出变量y
。
由于BINARY_SUBSCR
处理负数组索引,并且-0
在被推送到堆栈顶部之前将被评估为0
,因此需要进行重大更改(以及不必要的更改) )让解释器让arr[-0]
表示数组的最后一个元素。
答案 1 :(得分:1)
主要有几个原因:
有关详细信息:https://en.wikipedia.org/wiki/Zero-based_numbering#Usage_in_programming_languages
答案 2 :(得分:1)
在使用基于0的索引但没有将负索引实现为python的许多其他语言中,要访问列表(数组)的最后一个元素,需要查找列表的长度并为最后一个元素减去1,如下所示:
items[len(items) - 1]
在python中,len(items)
部分可以简单地省略,支持负索引,请考虑:
>>> items = list(range(10))
>>> items[len(items) - 1]
9
>>> items[-1]
9
答案 3 :(得分:0)
在python中:0 == -0
,所以x[0] == x[-0]
。
为什么序列索引为零而不是基于索引?这是语言设计师应该做的选择。我所知道的大多数语言都使用基于0的索引。 Xpath使用1作为选择。
使用否定索引也是该语言的惯例。不确定为什么选择它,但它允许通过对索引进行简单的加法(减法)来循环或循环序列。