2017-01-21 8 views
1

以下の動作を理解しようとしており、(特に公式ドキュメントの場合)またはコメントを歓迎します。リストスライシングでの否定的なステップの理解

>>> x[0:-4:-1] 
[] 

は結果的に、私は次のよう驚い:

これは

>>> x[-1:-4:-1] 
[6, 5, 4] 

を期待しかし、私は次驚いとして働く

>>> x = [1,2,3,4,5,6] 

は空です:

のリストを考えてみましょう空ではない

>>> x[0:-len(x)-1:-1] 
> [1] 

特に

>>> x[0:-len(x)-1] 
[] 

が空であることを

>>> x[0:-len(x):-1] 
[] 

とともにことを考えます。

答えて

2

リファレンス実装(Anonymous Benefactorのhattip)を指し示し、そこからの動作を理解するのはかなり簡単であることがわかりました。完了するためには、この動作は直感的ではありませんが、それにもかかわらず、明確に定義されており、参照実装と一致しています。

2つのCPythonファイル、すなわちlist_subscriptPySlice_AdjustIndicesを記述するファイルが関連します。この場合のようにリストからスライスを取得する場合、list_subscriptが呼び出されます。 PySlice_GetIndicesExが呼び出され、PySlice_AdjustIndicesが呼び出されます。 now PySlice_AdjustIndicesには、インデックスを調整する簡単なif/thenステートメントが含まれています。最後にスライスの長さを返します。我々の場合には、これらの線は、特に関連している。調整後、x[0:-len(x)-1:-1]x[0:-1:-1]になり、長さ1が返されます。ただし、x[0:-1:-1]を調整して調整すると、長さ0のx[0:len(x)-1:-1]になります。つまり、この場合はf(x) != f(f(x))です。

/* this is harder to get right than you might think */ 

最後に、問題の状況の取り扱いは、Python docsに記述されていないことに注意してください。

PySlice_AdjustIndicesで、次のコメントがあることに注意することが面白いです。

4

> x[-1:-4:-1] 
[6, 5, 4] 
> x[0:-4:-1] 
[] 

はあなたを驚かせるべきではないという事実!前の要素からではなく、最後の要素から最後の要素までリストをスライスすることができることは明らかです。

x[0:i:-1] 

i要素を含むように結果のインデックス< 0に解決するために、< -len(x)なければなりません。 スライスの構文はそのように簡単です:

x[start:end:step] 

手段、スライスは(ここでは:0startから始まり、end(または任意の負endによって参照インデックス)の前を終了します。 -len(x)0に解決され、0で始まり、0で終了するスライスは、要素が含まれない長さが0です。しかし、-len(x)-1は、実際の-1に解決され、0で始まる長さがのスライスになります。より直感的に理解されている後方のスライスに空のendを残す

> l[2::-1] 
[3, 2, 1] 
> l[0::-1] 
[1] 
+0

答えをいただきありがとうございますが、私はまだそれを取得しません。 -len(x)-1が-1に解決されると書いています。あなたは-1に解決する方法と、なぜなら私にとっては-len(x)-1が-7に等しいと思われるので、それを詳しく教えてください。それは、x [0] == x [-len(x)]という事実に関連していますか? – ffc

+0

うん。シーケンス 'seq'上のインデックスまたはスライス・パラメータとして使用される任意の負の数' -i'は、実際のインデックス 'len(seq)-i'に解決されます。したがって、長さ '6 'の' list'の場合、l [0:-7:-1]は、後方ステップの '0'から' -1'( '6 - 7')までのスライスです。最初の要素(インデックス '0')を含む後方スライスの場合、' end <-len(seq) 'を選択するか、空にしておかなければなりません:' seq [start :: - 1] '! – schwobaseggl

-1
x[0:-4:-1] 

は、使用して-1のステップを0から2に行きますか?

関連する問題