众所周知L [:: - 1]反转L,无论L是列表还是字符串
>>> l=[1,2,3]
>>> l[::-1]
[3, 2, 1]
>>> s
'abc'
>>> s[::-1]
'cba'
>>>
但我不知道这两个冒号是什么意思。我知道它使用'-1'作为步长从后到前,但你能更深入地解释一下吗?谢谢:D
答案 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做的有点不同 - 我认为原因很遗憾。