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

BTR*_*BTR 15 python slice python-3.x

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

for i in range(0, my_array.max(), 3)[:]:
    # other code here
Run Code Online (Sandbox Code Playgroud)

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

>>> range(0, 10, 3)
range(0, 10, 3)
>>> range(0, 10, 3)[:]
range(0, 12, 3)
Run Code Online (Sandbox Code Playgroud)

这些范围定义的实际顺序是相同的,但是我在Python 范围文档中的任何地方都看不到这种切片行为,因此我很好奇这里的实际情况。

900*_*000 1

我认为这里有一些事情是混合在一起的。

\n\n
    \n
  • range产生切片行为,因为使用非默认索引进行切片是有意义的:
  • \n
\n\n
>>> list(range(10, 20)[3:7])\n[13, 14, 15, 16]\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 有一种通过生成具有所有默认索引的切片来复制列表(可变的)的习惯用法:some_list[:]相当于[x for x in some_list].
  • \n
  • 有一段奇怪的代码对[:]范围对象(或实际列表,如果它是 Python 2)起作用,这使得的。无论如何,生成的范围对象/列表不会在其他任何地方引用。
  • \n
  • Python 文档在名为“序列类型 \xe2\x80\x94 list, tuple,range ”(重点是我的)所以它被记录下来,但很少有人读过它。
  • \n
\n