Python 索引背后的逻辑

dsa*_*ton 3 python indexing

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

M. *_*haw 5

Dijkstra在这里简洁地描述了一般基于零的索引的情况。另一方面,您必须考虑如何计算 Python 数组索引。由于首先计算数组索引:

x = arr[index]
Run Code Online (Sandbox Code Playgroud)

将首先解析并计算index,并且-0显然计算为0,因此必须arr[-0]指示最后一个元素是完全不可能的。

y = -0 (??)
x = arr[y]
Run Code Online (Sandbox Code Playgroud)

几乎没有意义。

编辑:

我们来看看下面的函数:

def test():
    y = x[-1]
Run Code Online (Sandbox Code Playgroud)

假设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
Run Code Online (Sandbox Code Playgroud)

基本上全局常量x(更准确地说是它的地址)被压入堆栈。然后评估数组索引并将其压入堆栈。然后是BINARY_SUBSCR执行的指令TOS = TOS1[TOS](其中的TOS意思是Top of Stack)。然后将栈顶弹出到变量中y

由于BINARY_SUBSCR处理负数组索引,并且在被推送到堆栈顶部之前-0将对其进行评估0,因此解释器需要进行重大更改(和不必要的更改)才能arr[-0]指示数组的最后一个元素。