2014-01-31 50 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