我对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中是如何工作的
答案 0 :(得分:2)
子序列或切片,符号是宽容的。 t[:3]
会从开头到结尾或第三个元素(以先到者为准)<{1>}为您提供一片t
,t[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解释器的情况。