Warum führt dies nicht 'example'[999:9999]
zu Fehlern? Da der 'example'[9]
Fall ist, was ist die Motivation dahinter?
Aufgrund dieses Verhaltens kann ich davon ausgehen, dass dies 'example'[3]
im Wesentlichen / intern nicht dasselbe ist wie 'example'[3:4]
, obwohl beide zu derselben 'm'
Zeichenfolge führen.
[999:9999]
ist kein Index, es ist ein Slice und hat eine andere Semantik. Aus dem Python-Intro: "Entartete Slice-Indizes werden ordnungsgemäß behandelt: Ein zu großer Index wird durch die Zeichenfolgengröße ersetzt. Eine Obergrenze, die kleiner als die Untergrenze ist, gibt eine leere Zeichenfolge zurück."Antworten:
Du hast Recht!
'example'[3:4]
und'example'[3]
sind grundlegend anders, und das Schneiden außerhalb der Grenzen einer Sequenz (zumindest für integrierte Funktionen) verursacht keinen Fehler.Es mag zunächst überraschend sein, aber es macht Sinn, wenn Sie darüber nachdenken. Durch die Indizierung wird ein einzelnes Element zurückgegeben, durch das Schneiden wird jedoch eine Teilsequenz von Elementen zurückgegeben. Wenn Sie also versuchen, einen nicht vorhandenen Wert zu indizieren, gibt es nichts zurückzugeben. Wenn Sie jedoch eine Sequenz außerhalb der Grenzen schneiden, können Sie dennoch eine leere Sequenz zurückgeben.
Was hier verwirrend ist, ist, dass sich Zeichenfolgen etwas anders verhalten als Listen. Schauen Sie, was passiert, wenn Sie dasselbe mit einer Liste machen:
Hier ist der Unterschied offensichtlich. Bei Zeichenfolgen scheinen die Ergebnisse identisch zu sein, da es in Python kein einzelnes Zeichen außerhalb einer Zeichenfolge gibt. Ein einzelnes Zeichen ist nur eine Zeichenfolge mit 1 Zeichen.
(Die genaue Semantik des Schneidens außerhalb des Bereichs einer Sequenz finden Sie in der Antwort von mgilson .)
quelle
None
anstatt einen Fehler zu machen - das ist die übliche Python-Konvention, wenn Sie nichts zurückgeben müssen.None
in diesem Fall würde es schwieriger macht zwischen einem Out-of-bounds - Index und einen sagenNone
Wert in einer Liste an . Aber selbst wenn es dafür eine Problemumgehung gab, bleibt mir klar, dass die Rückgabe einer leeren Sequenz das Richtige ist, wenn ein Slice außerhalb der Grenzen angegeben wird. Es ist analog zur Vereinigung zweier disjunkter Mengen.None
Werten in einer Liste.Um eine Antwort hinzuzufügen, die auf einen robusten Abschnitt in der Dokumentation verweist :
Bei einem Slice-Ausdruck wie
s[i:j:k]
:Wenn Sie schreiben
s[999:9999]
, kehrt Pythons[len(s):len(s)]
seitdem zurücklen(s) < 999
und Ihr Schritt ist positiv (1
- die Standardeinstellung).quelle
k
ist positivi
undj
werden auch erhöht,-len(s)
wenn sie geringer sind? zBs = 'bac'; s[-100:2] == s[-len(s):2]
k
positiv, wird Python skalierti
undj
so, dass sie den Grenzen der Sequenz entsprechen. In Ihrem Beispiels[-100:2] == s[0:2]
(== s[-len(s):2]
übrigens). Ebensos[-100:100] == s[0:2]
.Das Schneiden wird von den integrierten Typen nicht auf Grenzen überprüft. Und obwohl beide Beispiele das gleiche Ergebnis zu haben scheinen, funktionieren sie unterschiedlich. Versuchen Sie es stattdessen mit einer Liste.
quelle