なぜ'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*k
0 <= n < (j-i)/k
i
i+k
i+2*k
i+3*k
len(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のイントロから:「縮退したスライスインデックスは適切に処理されます。大きすぎるインデックスは文字列サイズに置き換えられ、下限よりも小さい上限は空の文字列を返します。」