3

这行代码

print [0, 1, 2, 3, 4][0:1:1]

返回[0]

但是,以下代码行:

print [0, 1, 2, 3, 4][0:0:1]

返回[]

为什么是这样?基于这个Explain Python's slice notation,我的理解是格式应该是:

a[start:end:step] # start through not past end, by step

所以不应该[0, 1, 2, 3, 4][0:0:1]在第 0 个值开始和结束,从而返回[0]

4

3 回答 3

6

切片的“结束”索引始终从结果中排除;即,listy[start:end]返回所有listy[i]位置start <= i < end(注意使用 of<而不是<=)。由于没有i这样的数字,0 <= i < 0,listy[0:0:anything]将始终是一个空列表(或错误)。

于 2013-10-27T02:17:33.107 回答
2

Python 切片表示法中的结束索引是独占的。切片[n:m]将返回索引为 >= n 且 < m 的每个元素。

为了简化一些事情,请尝试不使用 step(当 step 值为 1 时,这不是必需的):

>>> a = [0, 1, 2, 3, 4]
>>> a[0:1]
[0]
>>> a[0:0]
[]

作为一般规则,切片中的元素数等于切片的开始索引减去切片的结束索引。即,切片[n:m]将返回 mn 个元素。这与 . 返回的一个元素 (1-0) 和 . 返回的[0:1]零个元素 (0-0)一致[0:0]

(请注意,如果切片索引中的任何一个超出数组的大小,则情况并非如此。)

要获得切片索引如何工作的良好可视化,请在http://docs.python.org/2/tutorial/introduction.html搜索“记住切片如何工作的一种方法”

于 2013-10-27T02:22:42.133 回答
1

注意[0:0:1]不是[0:1:1]

所以:

start = 0
end = 0
step = 1

切片[start:end:step]意味着它将返回介于之间start和之间end - 1的值step,因此对于您的示例:

...[0:0:1]

值介于 0 和 -1 之间,因此它不返回任何内容。

于 2013-10-27T02:13:07.763 回答