なぜ'example'[999:9999]エラーが発生しないのですか?それ以来'example'[9]、その背後にある動機は何ですか?
この振る舞いから、両方が同じ文字列になる'example'[3]として'example'[3:4]も、本質的に/内部的には、と同じではないと推測でき'm'ます。
なぜ'example'[999:9999]エラーが発生しないのですか?それ以来'example'[9]、その背後にある動機は何ですか?
この振る舞いから、両方が同じ文字列になる'example'[3]として'example'[3:4]も、本質的に/内部的には、と同じではないと推測でき'm'ます。
回答:
あなたは正しいです!'example'[3:4]と'example'[3]は根本的に異なり、シーケンスの境界の外側でスライスしても(少なくとも組み込みの場合)、エラーは発生しません。
最初は意外かもしれませんが、考えてみると理にかなっています。インデックス付けは単一のアイテムを返しますが、スライスはアイテムのサブシーケンスを返します。したがって、存在しない値にインデックスを付けようとしても、何も返されません。ただし、シーケンスを境界外でスライスした場合でも、空のシーケンスを返すことができます。
ここで紛らわしいのは、文字列の動作がリストと少し異なることです。リストに対して同じことをするとどうなるか見てみましょう。
>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]
ここで違いは明らかです。文字列の場合、Pythonでは文字列の外側に個々の文字などがないため、結果は同じように見えます。1文字は1文字の文字列です。
(シーケンスの範囲外でスライスする正確なセマンティクスについては、mgilsonの回答を参照してください。)
Noneは、エラーではなく返される可能性があります。これは、返されるものがない場合の通常のPythonの規則です。
                    None、この場合に戻ると、範囲外のインデックスとNoneリスト内の値を区別するのが難しくなります。しかし、その回避策があったとしても、範囲外のスライスが与えられた場合、空のシーケンスを返すことが正しいことであることは私には明らかです。これは、2つの互いに素なセットの和集合を実行することに似ています。
                    Noneリストの値についてのあなたのポイントがわかります。
                    ドキュメントの堅牢なセクションを指す回答を追加するために:
のようなスライス式が与えられるとs[i:j:k]、
ステップkでのiからjまでのsのスライスは、次のようなインデックスを持つアイテムのシーケンスとして定義されます。つまり、インデックスがあり、、、ときなど、停止jが到達している(しかし、決して含めないJ)。kが正の場合、iとjは大きい場合に縮小されます。
x = i + n*k0 <= n < (j-i)/kii+ki+2*ki+3*klen(s)
と書くとs[999:9999]、s[len(s):len(s)]それ以降Pythonが返され、len(s) < 999ステップは正になります(1-デフォルト)。
kが正の場合、iそしてそれらが小さい場合にjも増加し-len(s)ますか?例s = 'bac'; s[-100:2] == s[-len(s):2]
                    kが正の場合、Pythonはスケーリングiしj、シーケンスの境界に合うようにします。あなたの例では、s[-100:2] == s[0:2](== s[-len(s):2]ちなみに)。同様に、s[-100:100] == s[0:2]。
                    スライスは制限されていません-組み込みのタイプによってチェックされます。また、両方の例で同じ結果が得られているように見えますが、動作は異なります。代わりにリストで試してください。
[999:9999]はインデックスではなく、スライスであり、セマンティクスが異なります。Pythonのイントロから:「縮退したスライスインデックスは適切に処理されます。大きすぎるインデックスは文字列サイズに置き換えられ、下限よりも小さい上限は空の文字列を返します。」