在python中选择子序列混淆

时间:2013-01-31 14:00:48

标签: python string

  

可能重复:
  The Python Slice Notation

我对python子序列选择的工作方式感到困惑。 假设我有以下代码:

>>> t = 'hi'
>>> t[:3]
'hi'
>>> t[3:]
''
>>> print t[:3] + t[3:]
hi
>>> print t[3]

Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
print t[3]
IndexError: string index out of range

请解释这个东西在python中是如何工作的

3 个答案:

答案 0 :(得分:2)

子序列或切片,符号是宽容的。 t[:3]会从开头到结尾或第三个元素(以先到者为准)<{1>}为您提供一片tt[3:]会为您提供一片来自第三个元素t(如果它存在到最后)。直接索引如t[3]并不宽容;索引元素必须存在,否则您将获得异常。对于切片,如果结束索引超出范围,则获得整个原始列表,如果开始索引超出范围,则会得到一个空列表。

答案 1 :(得分:2)

我总是觉得序列有点滑稽,它们允许切片越界。但是,这是documented。特别是在子点4中描述了序列类型的切片:

  

从i到j的s的片被定义为具有索引k的项的序列,使得i <= k <1。学家如果i或j大于len(s),则使用len(s)。如果省略i或None,则使用0.如果省略j或None,则使用len(s)。如果i大于或等于j,则切片为空。

或要点5,它描述了使用可选的stride参数进行切片:

  

具有步骤k的从i到j的s的片被定义为具有索引x = i + n * k的项的序列,使得0 <= n <1。 (J-I)/ K。换句话说,索引是i,i + k,i + 2 * k,i + 3 * k等等,当到达j时停止(但是从不包括j)。 如果i或j大于len(s),则使用len(s)。如果省略i或j或None,则它们变为“end”值(结束取决于k的符号) 。注意,k不能为零。如果k为None,则将其视为1

请注意,如果查看第3点(描述s[index]),则没有相应的越界索引转换为入边索引。

答案 2 :(得分:1)

t[start:stop]用start&lt; = x&lt;打印所有元素x停。当某些元素不存在时,它根本就不会打印它们。

另一方面,如果给定索引处没有元素,则

t[index]会出错。

在您的示例中,仅存在t[0]='h't[1]='i'来解释您的结果。

print t[3:]应该返回任何内容而不是'hi',这也是我的python解释器的情况。