作为一个侧面项目和C ++ 11实践,我正在Numpy的静脉中研究一个小型的n维数组库。我打算主要遵循Numpy惯例,但在切片的情况下,我正在考虑选择不同的东西。
问题在于,当使用负变量进行索引时,以及向后迭代时,范围的最后元素始终是不可访问的。例如,array[x:y]
不能包含负y
的最后一个元素。编辑:我不知道传递None
正是在Python中解决了这个问题。但问题仍然存在,因为它似乎是我想要避免的那种特殊解决方案,而C ++中的对应解决方案会很麻烦。
我考虑过三个主要选择:
使用包含范围,例如在Haskell中。毕竟,Haskellers并不特别为此烦恼。这虽然与Python体验有很大差异。
禁止否定索引。在可用性方面没有那么大的改进,并且当绝对需要从末尾计算索引时,从大小中简单地减去就足够了。
切片的方式与Python相同。上述问题在实际代码中很少出现,人们可以在出现问题时轻松识别和规避它。
我目前倾向于第一选择。有关此事的任何意见吗?
答案 0 :(得分:2)
你错误地说“使用变量进行索引时,范围的最后元素总是无法访问。”
>>> 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
也适用于向后阅读列表。