避免Python样式切片的陷阱
Avoiding the pitfalls of Python-style slicing
作为一个附带项目和C++11实践,我正在Numpy的静脉中开发一个n维数组的小型库。我打算主要遵循Numpy的惯例,但在切片的情况下,我正在考虑选择不同的东西。
问题是,当使用负变量进行索引时,以及当向后迭代时,范围的最后元素总是不可访问的。例如,array[x:y]
不能包括y
为负的最后一个元素。编辑:我不知道传递None
正是解决了Python中的这个问题。然而,这个问题仍然存在,因为它似乎是我想避免的那种特别的解决方案,而C++中的对应方案会很麻烦。
我考虑了三个主要选项:
-
使用包含范围,如在Haskell中。毕竟,Haskellers并没有为此特别烦恼,尽管这与Python的经验有很大的不同。
-
不允许负索引。它在可用性方面并没有太大的改进,当绝对需要从末尾计算索引时,只需从大小中简单减去就足够了。
-
以与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
在向后读取列表时也适用。
相关文章:
- 如何优雅地切片对象
- 避免矢量中的对象切片<Base><shared_ptr>
- 从 std::vector<无符号字符>切片中提取 int?
- 专门化模板覆盖函数/避免对象切片
- 我如何告诉叮叮当当的整洁切片特定类是可以的?
- FFMPEG:sws_scale返回错误:切片参数 0, 2160 无效
- 如何在 c++ 中进行 python 样式的字符串切片
- 如何检查 int 变量是否包含合法(非陷阱表示)值?
- Valarray 切片数组与 'operator*' 不匹配
- 如何在C++中实现切片运算符[]?
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 防止在按值传递对象(继承)时进行切片
- CUDA 高效的 nd-array(张量)切片
- 使用vtkImageReslice重新切片三维原始图像
- 如何组合切片、模板和非派生类
- 当比特数不是8的倍数时,使用切片8算法计算CRC
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 从右侧切片 Qstring
- C++ 被此代码与多态性、指针和对象切片混淆
- 避免Python样式切片的陷阱