避免Python样式切片的陷阱

Avoiding the pitfalls of Python-style slicing

本文关键字:陷阱 切片 样式 Python 避免      更新时间:2023-10-16

作为一个附带项目和C++11实践,我正在Numpy的静脉中开发一个n维数组的小型库。我打算主要遵循Numpy的惯例,但在切片的情况下,我正在考虑选择不同的东西。

问题是,当使用负变量进行索引时,以及当向后迭代时,范围的最后元素总是不可访问的。例如,array[x:y]不能包括y为负的最后一个元素。编辑:我不知道传递None正是解决了Python中的这个问题。然而,这个问题仍然存在,因为它似乎是我想避免的那种特别的解决方案,而C++中的对应方案会很麻烦。

我考虑了三个主要选项:

  1. 使用包含范围,如在Haskell中。毕竟,Haskellers并没有为此特别烦恼,尽管这与Python的经验有很大的不同。

  2. 不允许负索引。它在可用性方面并没有太大的改进,当绝对需要从末尾计算索引时,只需从大小中简单减去就足够了。

  3. 以与Python中相同的方式进行切片。提到的问题很少出现在真实的代码中,当它出现时,人们可以很容易地识别和规避它。

我目前倾向于选择一。对这件事有什么意见吗?

您错误地说"当使用变量进行索引时,范围的最后元素总是不可访问的。"

>>> x = 5
>>> y = 100
>>> r = list(range(10))
>>> r[x:y]      # much larger number than last index
[5, 6, 7, 8, 9]
>>> r[x:len(r)] # length of the list
[5, 6, 7, 8, 9]
>>> y = None
>>> r[x:y]      # variable set to None
[5, 6, 7, 8, 9]

None在向后读取列表时也适用。