python双冒号,-1为第三个参数

Jud*_*ing 8 python python-2.7

a = [1,2,3,4,5]作为一个例子.从我的直觉来看,我认为a[::-1]是一样的a[0:len(a):-1].但结果变成了错误:

>>> a = [1,2,3,4,5]
>>> print a[::-1]
[5, 4, 3, 2, 1]
>>> print a[0:len(a):-1]
[]
>>> print a[0:3:-1]
[]
>>> print a[0:2:-1]
[]
>>> print a[:2:-1]
[5, 4]
>>> print a[:0:-1]
[5, 4, 3, 2]
>>> print a[0:-1]
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我实际上无法理解最后6次尝试的输出.谁能给我一些想法?谢谢吨.

Mat*_*hew 11

要使用的语法是[start:end:step]end不包含的地方.

Python遵循一些基于可能意味着的规则(可能它们不是你的意思,但语言设计者在那种情况下获得最终投票).我们将进一步研究确切的规则.

a[::-1]是一个反转列表的快捷方式.如果我们说没有任何界限向后工作,我们可能意味着从结束到开始.

a[0:len(a):-1]表示从0开始,按-1表示从len(a)开始.请注意,这是不可能的(我们最终会得到无数个负数),因此结果为空. a[0:3:-1]a[0:2:-1]有同样的问题.

在最后一个示例中,a[0:-1]负一个索引表示最后一个元素.你可能意味着从开始到结束.请注意,终点不包括在内.这给出了除最后一个元素之外的所有元素(也可以指定为a[:-1]).

使用时a[:2:-1],您可以向后指定一个运动,因此您可能意味着从最后一个元素向后移动到2个索引.这给出[5,4]了你的例子.该a[:0:-1]情况是类似的,但运动发生之初,给人[5,4,3,2].


参考cpython源代码,我们可以看到实际的规则.

  1. 如果未给出步骤,则它等于1
  2. 如果未给出起始值,如果step不为负,则选择默认start为0;如果step为非负,则选择length -1
  3. 如果没有给出结束值,如果step不是负数,则选择默认结束为长度;如果是,则选择-1(这些值允许保留最后一个元素,知道结束点是非包含的)

如果给出,则对开始值和结束值进行一些调整

  1. 如果该值小于0,则为其添加长度
  2. 如果它仍小于0,如果步骤为非负,则将其设置为0,否则将其设置为-1
  3. 如果它大于或等于长度,如果步长为负,则将其设置为小于长度,或者等于长度.

请注意,在大多数情况下,规则确定可以精确给出的值以获得等效形式.例外情况是默认规则确定-1的起点或终点.如果我们给出该值,修改值的规则将改变它.

我们得到了这些规则

  • a[::-1] 使用start of length-1(默认值),结束-1(默认值)和步长-1
  • a[0:len(a):-1],a[0:3:-1]a[0:2:-1]使用给定的值
  • a[:0:-1] 使用长度为1的开始(默认值),结束为0,步长为-1
  • a[:2:-1] 使用length的长度为1(默认值),结束为2,步长为-1
  • a[0:-1] 使用0的开头,长度为1的末尾(已修改)和步长为1(默认值)

此时,我们可以确定是否可以进行选择.在空的情况下,由于步骤为负并且开始<结束,我们现在看到这是不可能的.

  • `a [:2:-1]`不等于`a [:: - 1] [:2]`.对于长度为"n"的列表("n"至少为3),前者具有"n-3"元素; 后者有'2`元素. (2认同)