在Python中,我想知道为什么切片按照他们的方式工作。为什么Guido van Rossum将a[start:end]
定义为包括a[start]
,但是不是a[end]
,或者如标题中所示,为什么a[0:1]
只包含第一个元素而不是前两个?Python范围切片和索引行为
这似乎是从MATLAB的索引行为退后一步。
编辑:我问这个问题的原因是它令人困惑,a[0:0]
是空的。但我没有设计一种流行的语言,所以我知道什么。
在Python中,我想知道为什么切片按照他们的方式工作。为什么Guido van Rossum将a[start:end]
定义为包括a[start]
,但是不是a[end]
,或者如标题中所示,为什么a[0:1]
只包含第一个元素而不是前两个?Python范围切片和索引行为
这似乎是从MATLAB的索引行为退后一步。
编辑:我问这个问题的原因是它令人困惑,a[0:0]
是空的。但我没有设计一种流行的语言,所以我知道什么。
要quote吉多·范罗苏姆自己:
[...]我被半开区间的风采左右。特别是 不变的是,当两个切片相邻时,第一个切片的末端 索引就是第二个切片的起始索引,只是太漂亮而无法忽略 。例如,假设你在 索引i和j处将一个字符串拆分为三部分 - 这些部分将是[:i],a [i:j]和[j:]。
a[start:end-1]
允许您使用a[0:len(a)]
。
它适合所有其他功能,如range()
等。
当然你会在这种情况下总是使用'[:]'?但关于使用'len(a)'作为“stop”的观点是有效的,例如,对'范围'。 – jonrsharpe
@jonrsharpe你是对的,但这只是一个很容易理解的例子。 – 1478963
Python索引是基于0的。通过不含结束值,最切片和range()
操作可以自然地反映数目切片的项目或制造,同时仍然包括索引为0
因此,通过range(10)
产生10种元素,从0到9切片到与sequence[:1]
产生1个元素,索引0.
此外,不包括结束索引使得更容易使用相同的值作为下一节的开始。因此sequence[:i] + sequence[i:]
从两个切片重新创建sequence
,而不必调整i
。
因为不包括结尾索引与基于0的索引整合在一起。 'range(10)'产生从0到9的索引,用'sequence [:len(sequence)]'作切片等等。 –
我注意到MATLAB使用基于1的索引,这意味着封闭索引会使一些感。但是,您不会在MATLAB中获得Python中不错的'a == a [:end] + a [end:]'不变量。 –