python - python range()[ :] 的切片行为

标签 python python-3.x slice

我在 QC 审查中发现了一段有趣的代码,并对它的行为感到惊讶。我很好奇它是否在任何地方都有记录。

for i in range(0, my_array.max(), 3)[:]:
    # other code here

我很好奇 range 之后是否需要 [:],所以我测试了它:

>>> range(0, 10, 3)
range(0, 10, 3)
>>> range(0, 10, 3)[:]
range(0, 12, 3)

这些范围定义的实际序列是相同的,但我没有在 Python range 中的任何地方看到这种切片行为的记录。文档,所以我很好奇这里到底发生了什么。

最佳答案

暂时让我们假设 range 仍然返回一个 list。对 range 对象进行切片会返回一个 range 对象,该对象的作用就好像您正在对基础列表进行切片一样。不过,range 对象不是使用列表来执行此操作,而是能够使用算术在恒定时间内处理它。

>>> range(0, 90, 2)[10:23]
range(20, 46, 2)

>>> list(range(0, 90, 2)[10:23])
[20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44]

当你做类似的事情时:

range(0, 10, 3)[:]

Python 使用算术对其进行切片。

我的假设是,在确定最终元素时,它会四舍五入。它尝试计算范围内的第零个元素作为开始。这将是 start + step * 0 = 0

然后 Python 尝试获取结束元素。范围内有(10 - 0)//3 + 1 = 4个元素,所以结束元素为start + step * n_elements = 0 + 3 * 4 = 12

关于python - python range()[ :] 的切片行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57577175/

相关文章:

arrays - MongoDB 获取文档的部分数组

arrays - 有关如何在 swift 中实现 Slice<T> 的任何提示吗?

python - 如何快速比较 ndarray 的每个元素与排序列表/数组的每个元素?

python - 如何在 Python 3 中进行随机数迭代?

python-3.x - 如何在 Flask-Appbuilder 中为 OAuth2.0 使用自定义提供程序 [keycloak]?

python - PyQt 启用/禁用 QComboBox 中的元素

dictionary - 遍历包含不同级别 map 的界面 map

python - Numpy高效矩阵自乘(gram矩阵)

python - pip 编辑模式 "Module not found"

python - 获取dir(class)中变量的值