为什么使用some_string [-1:]而不是some_string [-1]?

时间:2014-11-11 09:24:21

标签: python slice

foo = 'eggs'

foo[:1] # the same is foo[0]
foo[-1:] # the same is foo[-1]

这些方法之一有什么好处吗?

我在这里碰到了这个 https://hg.python.org/cpython/file/3.4/Lib/xml/etree/ElementPath.py#l254

UPD。你能去链接吗?变量path是一个字符串。我很困惑,为什么他们使用切片而不是使用concreate索引。

if path[-1:] == "/":

3 个答案:

答案 0 :(得分:1)

字符串是切片的特殊情况,因为切片返回str,但是要求具体索引也返回str。与C,C ++,Java不同,我们在Python中没有char数据类型。

您可以在普通list上看到真正的区别。使用分号返回一个切片,即list,而具体索引返回列表中的单个元素;在这种情况下,int。也就是说,数据类型是不同的。

>>> foo = [66,67,68,69]
>>> foo[:1]
[66]
>>> foo[-1:]
[69]
>>> foo[0]
66
>>> foo[-1]
69

答案 1 :(得分:1)

切片的工作原理如下:

#bring everything from start to end as list
foo[::]

#bring last item as list
foo[-1:]

#careful not to confuse with ->bring last item
foo[-1]

切片基本上就像这样

foo[starting_point:ending_point:step]
#default starting point=0
#default end point is len(foo)
#default step=1

检查foo[-1]foo[-1:]之间的区别除了第一个返回项目(不可变)而第二个返回列表(可变)之外,如果foo[]为空,{ {1}}会引发foo[-1]IndexError会返回一个空列表。

现在在您的链接上: https://hg.python.org/cpython/file/3.4/Lib/xml/etree/ElementPath.py#l254

我们在这里讨论字符串,因此foo[-1:]path[-1]的结果将是一个字符串。因此,首选path[-1:]的原因是,如果path[-1:]path=""将提升path[-1]IndexError将返回path[-1:]

答案 2 :(得分:0)

str是一种特殊情况,因为切片和元素访问都将返回另一个str。不同之处在于字符串为空时会发生什么:提取列表会返回一个空字符串,而获取一个具体元素会引发错误。

--> test = 'hello'
--> test[0]
'h'
--> test[:1]
'h'
--> empty = ''
--> empty[:1]
''
--> empty[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range