Ein Teil der Frage zu Indizes außerhalb des Bereichs
Die Slice-Logik schneidet die Indizes automatisch auf die Länge der Sequenz.
Das Ermöglichen, dass sich Slice-Indizes über Endpunkte hinaus erstrecken, wurde der Einfachheit halber durchgeführt. Es wäre mühsam, jeden Ausdruck im Bereich zu überprüfen und dann die Grenzwerte manuell anzupassen, damit Python dies für Sie erledigt.
Stellen Sie sich den Anwendungsfall vor, dass nicht mehr als die ersten 50 Zeichen einer Textnachricht angezeigt werden sollen.
Der einfache Weg (was Python jetzt macht):
preview = msg[:50]
Oder auf die harte Tour (Limit-Checks selbst durchführen):
n = len(msg)
preview = msg[:50] if n > 50 else msg
Die manuelle Implementierung dieser Logik zur Anpassung der Endpunkte wäre leicht zu vergessen, wäre leicht zu verwechseln (Aktualisierung der 50 an zwei Stellen), wäre wortreich und langsam. Python verschiebt diese Logik in seine Interna, wo sie kurz, automatisch, schnell und korrekt ist. Dies ist einer der Gründe, warum ich Python liebe :-)
Ein Teil der Frage bezüglich der Nichtübereinstimmung der Zuordnungslänge mit der Eingabelänge
Das OP wollte auch die Gründe für das Zulassen von Zuweisungen kennen, z. B. p[20:100] = [7,8]
wenn das Zuweisungsziel eine andere Länge (80) als die Länge der Ersatzdaten (2) hat.
Es ist am einfachsten, die Motivation durch eine Analogie mit Strings zu erkennen. Betrachten Sie , "five little monkeys".replace("little", "humongous")
. Beachten Sie, dass das Ziel "klein" nur sechs Buchstaben und "humongous" neun hat. Wir können dasselbe mit Listen machen:
>>> s = list("five little monkeys")
>>> i = s.index('l')
>>> n = len('little')
>>> s[i : i+n ] = list("humongous")
>>> ''.join(s)
'five humongous monkeys'
Dies alles hängt von der Bequemlichkeit ab.
Vor der Einführung der Methoden copy () und clear () waren dies beliebte Redewendungen:
s[:] = []
t = u[:]
Selbst jetzt verwenden wir dies, um Listen beim Filtern zu aktualisieren:
s[:] = [x for x in s if not math.isnan(x)]
Ich hoffe, diese praktischen Beispiele geben einen guten Überblick darüber, warum das Schneiden so funktioniert.
if i > sequence.length(): return sequence.slice(0, sequence.length()) else sequence.slice(0, n)
Dies ist genau das gleiche wie bei der Verwendungsequence[:n]
in Python. Es erspart Ihnen eine if-Anweisung und zwei Aufrufe vonlength
.