带有-1作为第三个参数的python双冒号

标签 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]

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

最佳答案

要使用的语法是 [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 source code ,我们可以看到实际的规则。

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

如果给定了起始值和结束值,则进行一些调整

  1. 如果小于0,则增加长度
  2. 如果仍然小于0,步长非负则设置为0,否则设置为-1
  3. 如果大于或等于长度,如果步长为负,则将其设置为比长度小一,否则等于长度

请注意,在大多数情况下,规则确定可以准确给出以获得等效形式的值。异常(exception)情况是默认规则确定起点或终点为 -1。如果我们给出那个值,修改值的规则就会改变它。

应用这些规则我们得到

  • a[::-1] 使用长度为 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] 使用长度为 1 的开始(默认)、2 的结束和 -1 的步长
  • a[0:-1] 使用 0 开始,length-1 结束(修改),步长 1(默认)

此时,我们可以确定是否可以进行选择。在空的情况下,由于 step 为负且 start

关于带有-1作为第三个参数的python双冒号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35975581/

相关文章:

python - python内置类型的扩展方法

python - 仅使用 Pandas 转换某些行

python-2.7 - Elasticsearch : es. index() 消息推送时改变映射

python - 当行的 html 标签未嵌套在 header 标签下时,抓取表头下方的信息行

python-2.7 - 计算图中的多条边(python)

python - 我将如何在 python 中发送电子邮件?此代码无效

python - 用户输入的三角形边和程序(Think Python 练习 5-4-2)

Python 2 与 3 正则表达式的区别

Python TEA 实现

python - 如何使用 Python 压缩 For 循环和 if else