首页 > 解决方案 > python range()[:] 的切片行为

问题描述

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

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

[:]我对after的需求感到好奇range,所以我对其进行了测试:

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

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

标签: pythonpython-3.xslice

解决方案


暂时让我们假设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.


推荐阅读