0

举个例子:

a = range(10)  

我们可以按如下方式从左到右遍历列表:a[0], a[1], ...., a[9] 或者反过来使用负索引:a[-1], a[-2], a[-3], ....

也可以索引一个范围,例如a[from:to-1]

因为我知道最后一个元素的索引是-1,所以我会说(理论思想)a[0:0]应该提供整个列表,因为a[0:0-1]从 0 到 -1(包括 -1)。

这是错误的,但为什么呢?这对我来说比a[0:](整个列表)更有意义编辑:

所以为了简单起见(我只是想知道!^^): 意味着:从toa[from:to-1]获取元素。好的,我们想要获取整个列表,意思是(按照这个推理):(这是空列表),但是 0-1 是最后一个元素,对吧?fromtoa[0:0]

4

5 回答 5

2

索引不是“循环的”:

a = [0, 1, 2]
a[2]  # 2
a[3]  # IndexError, not 0
a[-3] # 0
a[-4] # IndexError, not 2

-3因为索引只是length-3.

于 2013-04-26T13:15:53.863 回答
1

切片s[i:j]就是这样定义的:

  • 如果iorj为负数,则索引相对于字符串的结尾:len(s) + iorlen(s) + j被替换。但请注意,-0仍然是0.
  • sfrom ito的切片j被定义为具有索引的项目序列,k使得i <= k < j。如果ij大于len(s),请使用len(s)。如果i省略或无,请使用0. 如果j省略 or None,请使用len(s). 如果i大于或等于j,则切片为空。

所以a[0:0]给你一个空列表,因为i等于j。并且a[i:j]因为否定在切片发生之前j被翻译a[i:range(a) + j],所以a[0:-1]它本身不是一个有效的切片(因为i < j不是真的),但是因为翻译发生在之前,它可以工作。

于 2013-04-26T13:16:46.700 回答
1

range1从停止参数中减去。它增加(或减少——假设在这个例子中它增加)直到它大于或等于stop(因为它不包括终点)然后它返回。a[0:0]不应该传递整个数组,因为您告诉它从00不包括端点0,这是一个空范围。

于 2013-04-26T13:11:23.777 回答
1

这是因为当您切片时,正数从列表的开头开始计算,而负数从列表的末尾开始计算。当你切片时,你会从第一个索引(包括)到第二个索引(不包括)。如果该范围内没有任何内容,则会得到一个空列表。

a[0:0]

对于很多人来说,这将是一个非常令人困惑的 API。有时想想python实际上在做什么是有帮助的:

a[slice(0,None)]

这表示我们从 0 开始,但没有上限,这是 python 的说法,上限是无限的——因此你需要所有元素。

当然,这也可以通过以下方式完成:

a[:]

在这种情况下,也没有下限......

于 2013-04-26T13:12:40.193 回答
0

看起来您是在询问反向迭代,而不是循环索引。反向迭代很简单,使用切片或reversed().

for i in range(10)[::-1]:
    print i
for i in reversed(range(10)):
    print i

反转是不言自明的。对于切片,冒号分隔列表中的第三个值是步骤。如果您指定一个负步骤,它将在列表中向后迭代。如果您不指定开始或停止,它将遍历整个列表。

于 2013-04-26T13:12:08.527 回答