Python索引背后的逻辑

时间:2015-08-05 02:39:05

标签: python indexing

我在Python中很好奇为什么x[0]检索x的第一个元素,而x[-1]以相反顺序读取时检索第一个元素。语法似乎与我不一致,因为在一种情况下我们计算距离第一个元素的距离,而我们在向后阅读时不计算距离最后一个元素的距离。不会像x[-0]那样更有意义吗?我有一个想法是Python中的区间通常被认为是相对于下限的包容性但是对于上限是独占的,因此索引可以被解释为距下限或上限元素的距离。关于为何选择这种符号的任何想法? (我也很好奇为什么零索引是首选。)

4 个答案:

答案 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)

主要有几个原因:

  • 计算机使用基于0的数字
  • 较旧的编程语言使用基于0的索引,因为它们是低级别且更接近机器代码
  • 较新的,较高级别的语言使用它来保持一致性和相同的原因

有关详细信息: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作为选择。

使用否定索引也是该语言的惯例。不确定为什么选择它,但它允许通过对索引进行简单的加法(减法)来循环或循环序列。