在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:]'不變量。 –