c++ - 避免 Python 式切片的陷阱

标签 c++ python slice

<分区>

作为一个业余项目和 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 也适用于向后阅读列表。

关于c++ - 避免 Python 式切片的陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17497157/

相关文章:

c++ - 内联汇编跳转到标签

c++ - 返回地址是否确保非 NULL 返回值?

c# - 不支持 8 位无符号整数 vector

c++ - 在 CMake 中处理多个项目

python - 表单处理Django中的日期时间对象格式错误

python - 如何从 Squish 测试脚本中获取 Qt 对象的方法签名?

html - 显示一定长度的字符串而不截断

python - 将 emacs 缓冲区发送到任意 Python 进程

Golang 类型断言失败

python - 默认切片索引 *真的* 是什么?