2014-01-31 51 views
-1

在Python中,我想知道为什么切片按照他们的方式工作。为什么Guido van Rossum将a[start:end]定义为包括a[start],但是不是a[end],或者如标题中所示,为什么a[0:1]只包含第一个元素而不是前两个?Python范围切片和索引行为

这似乎是从MATLAB的索引行为退后一步。

编辑:我问这个问题的原因是它令人困惑,a[0:0]是空的。但我没有设计一种流行的语言,所以我知道什么。

+1

因为不包括结尾索引与基于0的索引整合在一起。 'range(10)'产生从0到9的索引,用'sequence [:len(sequence)]'作切片等等。 –

+0

我注意到MATLAB使用基于1的索引,这意味着封闭索引会使一些感。但是,您不会在MATLAB中获得Python中不错的'a == a [:end] + a [end:]'不变量。 –

回答

5

quote吉多·范罗苏姆自己:

[...]我被半开区间的风采左右。特别是 不变的是,当两个切片相邻时,第一个切片的末端 索引就是第二个切片的起始索引,只是太漂亮而无法忽略 。例如,假设你在 索引i和j处将一个字符串拆分为三部分 - 这些部分将是[:i],a [i:j]和[j:]。

+0

啊......好吧,所以有一些方法来疯狂:) – Andrew

+0

+ 1,你应该添加这个问题这个重复 – jonrsharpe

+0

@jonrsharpe,好主意。完成! –

0

a[start:end-1]允许您使用a[0:len(a)]

它适合所有其他功能,如range()等。

+0

当然你会在这种情况下总是使用'[:]'?但关于使用'len(a)'作为“stop”的观点是有效的,例如,对'范围'。 – jonrsharpe

+0

@jonrsharpe你是对的,但这只是一个很容易理解的例子。 – 1478963

0

Python索引是基于0的。通过不含结束值,最切片和range()操作可以自然地反映数目切片的项目或制造,同时仍然包括索引为0

因此,通过range(10)产生10种元素,从0到9切片到与sequence[:1]产生1个元素,索引0.

此外,不包括结束索引使得更容易使用相同的值作为下一节的开始。因此sequence[:i] + sequence[i:]从两个切片重新创建sequence,而不必调整i