在Python中,我想知道为什么切片按照他们的方式工作。为什么Guido van Rossum定义a[start:end]
以包含a[start]
但不 a[end]
,或者如标题所示,为什么a[0:1]
仅包含第一个a[0:0]
元素而不是前两个?
这似乎是MATLAB索引行为的一个退步。
编辑:我问这个问题的原因是{{1}}为空是令人困惑的。但我没有设计一种流行语言,所以我知道什么。
答案 0 :(得分:5)
致quote Guido van Rossum本人:
[...]我被半开的间隔的优雅所左右。特别是 不变的,当两个切片相邻时,第一个切片的结束 index是第二个切片的起始索引太漂亮了 忽视。例如,假设您将字符串拆分为三个部分 索引i和j - 部分将是[:i],a [i:j]和a [j:]。
答案 1 :(得分:0)
a[start:end-1]
允许您使用a[0:len(a)]
。
它适用于所有其他功能,例如range()
和其他功能。
答案 2 :(得分:0)
Python索引是基于0的。通过排除结束值,大多数切片和range()
操作可以自然地反映切片或生成的项目的数量,同时仍包括索引0。
因此,range(10)
产生10个元素,从0到9.切片到sequence[:1]
产生1个元素,索引0。
此外,不包括结束索引使得更容易使用相同值作为下一部分的开头。因此sequence[:i] + sequence[i:]
从两个切片重新创建sequence
,而无需调整i
。