拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 为什么没有抛出IndexError以及为什么当所需的索引大于串列长度时输出为空串列?

为什么没有抛出IndexError以及为什么当所需的索引大于串列长度时输出为空串列?

白鹭 - 2022-03-25 2131 0 0

下面的串列 x 只有 3 的长度,最大索引为 2,它不应该抛出索引错误而不是空串列吗?

x = [1,2,3]
print(x[100:])

输出是

[]

uj5u.com热心网友回复:

与索引单个元素不同,允许使用切片索引越界。这对于切片很有用,例如x[1:5]您不需要知道x. 如果它走得太远,它将在实际资料的末尾停止。

这是一个派上用场的示例,该函式将串列分解为最大大小的块n

def chunk(lst: list, n: int) -> list[list]:
    result = []
    for i in range(0, len(lst), n):
        result.append(lst[i:i n])
    return result

如果您尝试使用不能被块大小完全整除的输入串列运行几次,您将看到结果中的最后一个元素将比其余元素短,即使我们没有在特殊情况下编码对于最后一块。

切片的宽容性质适用于切片的两端。如您所见,如果切片的索引完全不在串列的末尾,您会得到一个空结果而不是错误。

uj5u.com热心网友回复:

它不会抛出错误,因为您使用的是切片语法。由于您对越界序列进行切片,Python 回传空串列的结果。我认为原因是串列的该范围内没有值x

请参阅Sequence Types — list, tuple, range档案中的注释 4

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

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *