一旦我们写L = L [:: - 1],真的发生了什么?

时间:2015-02-17 00:52:04

标签: python

众所周知L [:: - 1]反转L,无论L是列表还是字符串

>>> l=[1,2,3]
>>> l[::-1]
[3, 2, 1]
>>> s
'abc'
>>> s[::-1]
'cba'
>>> 

但我不知道这两个冒号是什么意思。我知道它使用'-1'作为步长从后到前,但你能更深入地解释一下吗?谢谢:D

1 个答案:

答案 0 :(得分:0)

在python中的[]内,语言规范将:解析为slice个对象。

你可以只给它一个:或两个。如果省略值,则会对它们进行特殊处理(即作为结束值)。

它描述了here

更深入:

解析程序时,[]的处理方式与代码的其他部分不同;

如图所示:

预告片:'(' [arglist]')' | ' ['下标列表']' | ''名称 下标列表:下标(','下标)* [','] 下标:'。' '' '' |测试| [测试]':' [测试] [sliceop] sliceop:':' [测试]

python grammar

中的

值得注意的是,个别subscript可以是...,也可以是单个项目(在这种情况下为test),也可以是{test。 1}}由:分隔。

关键是,当你在那里使用:时,它会被翻译成一个切片对象,它只是传递给__getitem__对象方法*。

object如何处理传递的切片对象取决于__getitem__的实现。尝试做这样的事情:

class my_class(object):
  def __getitem__(*slices):
    print slices
    pass

c = my_class()
c[1]
c[1:2]
c[1:2:3]
c[:2]
c[::3]
c[1::3]
c[1, 1:, :2, ::3, 1:2, 1::3, object(), [1,2,3,4,5]]

请注意,所有发生的事情都是您放在[] jsut之间的各种对象传递给__getitem__方法。在python的当时和任何其他地方之间唯一不同的是,在[]内部还有slice()快捷语法start:end:step的附加解析。

*至少它适用于您创建的任何对象。内置者的Soem做的有点不同 - 我认为原因很遗憾。