为什么python列表切片允许引用不存在的条目?

时间:2017-06-19 22:48:24

标签: python slice

考虑以下代码:

>>> arr = np.array(['A', 'B', 'C'])
>>> arr[0:20]
array(['A', 'B', 'C'], 
      dtype='|S1')

为什么我允许将数组切片3?我希望这会抛出一个错误,因为没有20个条目可供引用。

2 个答案:

答案 0 :(得分:1)

这也适用于常规列表切片,字符串切片和元组切片以及大多数可切片对象。只是Python惯例允许超出范围的切片并将超出范围的切片端点调整到序列的最近端点。

答案 1 :(得分:1)

这取自documentation

给出像s[i:j:k]

这样的切片表达式
  

具有步骤k的从i到j的s的片被定义为具有索引x = i + n * k的项的序列,使得0 <= n <1。 (J-I)/ K。换句话说,索引是i,i + k,i + 2 * k,i + 3 * k等等,当到达j时停止(但是从不包括j)。 当k为正数时,如果它们更大则i和j减少为len(s)

同样适用于numpy数组。给定一个切片表达式,比如说x[0:20],它将被简化为x[0:len(x)],返回数组中的所有内容。

Python通过返回尽可能多的元素来优雅地处理对元素的越界访问,而不会抛出错误。这是该语言开发人员的设计决策。您可能想也可能不想要错误,因此在以这种方式切片时要小心。