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