1

可能的重复:
Python 切片表示法

我对 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中是如何工作的

4

3 回答 3

2

我总是觉得它们允许切片超出范围的序列行为有些有趣。但是,这是记录在案的。特别是在要点 4 中,它描述了序列类型的切片:

从 i 到 j 的 s 切片被定义为具有索引 k 的项目序列,使得 i <= k < j。如果 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 < (ji)/k。换句话说,索引是 i、i+k、i+2*k、i+3*k 等等,当达到 j 时停止(但从不包括 j)。如果 i 或 j 大于 len(s),则使用 len(s)。如果 i 或 j 被省略或没有,它们将成为“结束”值(结束取决于 k 的符号)。注意,k 不能为零。如果 k 为无,则将其视为 1

请注意,如果您查看第 3 点(其中描述了s[index]),则没有从越界索引到界内索引的相应转换。

于 2013-01-31T14:10:06.960 回答
2

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

于 2013-01-31T14:05:18.167 回答
1

t[start:stop]打印 start <= x < stop 的所有元素 x。当某些元素不存在时,它根本不会打印它们。

t[index]另一方面,如果给定索引处没有元素,则会出错。

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

print t[3:]应该什么都不返回而不是'hi',这也是我的python解释器的情况。

于 2013-01-31T14:08:55.037 回答