我在 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/