Warum erzeugt somelist [len (somelist)] einen IndexError, aber nicht somelist [len (somelist):]?

8

Ich verstehe, dass somelist[len(somelist)] nicht auf einen Index zugreifen kann, der außerhalb der definierten Liste liegt - das ist sinnvoll.

Aber warum erlaubt Python dann somelist[len(somelist):] ?

Ich habe sogar gelesen, dass somelist[len(somelist):] = [1] äquivalent zu somelist.append(1)

ist

Aber warum ändert Slice-Notation die Tatsache, dass der Index "len (somelist)" immer noch außerhalb des Bereichs der Liste liegt?

    
Alex Krycek 18.03.2013, 05:33
quelle

3 Antworten

4

Hier ist etwas aus der Dokumentation . Es gibt spezifische Regeln für das Slicing von Iterablen; Besonders hervorzuheben ist # 4, Betonung meins:

  

Die Scheibe von s von i bis j ist definiert als die Reihenfolge der Artikel mit   index k so dass i <= k < j . Wenn i oder j größer als len(s) ist, verwenden Sie   %Code%. Wenn len(s) weggelassen wird oder i , verwenden Sie None . Wenn 0 weggelassen wird oder j , verwenden Sie   %Code%. Wenn None größer oder gleich len(s) ist, ist das Segment leer.

    
Makoto 18.03.2013, 05:42
quelle
1

Es gibt nichts am Index len(somelist) (Listenindizes beginnen bei 0 in Python). Wenn Sie versuchen, auf ein nicht vorhandenes Element zuzugreifen, tritt ein Fehler auf.

Beim Listen-Slicing (mit der myList[i:] -Syntax) wird jedoch eine neue Liste zurückgegeben, die die Elemente einschließlich und nach i enthält. Da sich am Index i (oder danach) keine Elemente in der Liste befinden, wird eine leere Liste zurückgegeben

    
inspectorG4dget 18.03.2013 05:37
quelle
1

Aus den Python-Dokumenten :

  

Entartete Slice-Indizes werden elegant gehandhabt: Ein Index, der zu groß ist, wird durch die String-Größe ersetzt, eine obere Grenze, die kleiner ist als die untere, gibt eine leere Zeichenfolge zurück.

Also ein Index & gt; Listengröße wird automatisch korrigiert, und somelist[len(somelist):] gibt die Elemente nach der letzten zurück, dh nada .

    
dda 18.03.2013 05:40
quelle

Tags und Links