2016-08-19 3 views
9

Schneiden Wenn mit Slicing experimentiert ich ein seltsames Verhalten in Python bemerkt 2.7:Python - Grund erweitert vs

class A: 
    def __getitem__(self, i): 
     print repr(i) 
a=A() 
a[:] #Prints slice(0, 9223372036854775807, None) 
a[::] #prints slice(None, None, None) 
a[:,:] #prints (slice(None, None, None), slice(None, None, None)) 

Bei Verwendung eines einzigen Doppelpunkt in den Klammern, die Scheibe Objekt 0 als Start und eine große ganze Zahl als Ende. Wenn ich jedoch mehr als einen einzelnen Doppelpunkt verwende, sind Start und Stopp Keine, wenn nicht angegeben.

Ist dieses Verhalten garantiert oder implementierungsspezifisch?

Die Documentation sagt, dass der zweite und dritte Fall erweitert Slicing sind, während der erste Fall nicht ist. Ich konnte jedoch keine klare Erklärung für den Unterschied zwischen Basis- und erweitertem Slicing finden.

Gibt es noch andere "Spezialfälle", die ich beachten sollte, wenn ich __getitem__ außer Kraft setze und erweiterte Schnitte akzeptieren möchte?

+0

Mit Python 2.7 bekomme ich '2147483647' (2^31-1), also ist der Wert definitiv systemspezifisch. Mit Python 3 bekomme ich in allen Fällen 'None'. –

+3

Es ändert sich auch in "None", wenn Sie "A" zu einer neuen Stilklasse machen. –

Antwort

10

Für Python 2 [:] noch ruft __getslice__(self, i, j) (veraltet) und dies dokumentiert ein Stück zurück slice(0, sys.maxsize, None), wenn sie mit Standardparametern aufgerufen:

Beachten Sie, dass i oder j in der Scheibe Ausdruck fehlt durch Null ersetzt werden oder sys.maxsize, ...

(Hervorhebung von mir). New Style-Klassen nicht implementieren __getslice__() standardmäßig so

Wenn keine __getslice__() gefunden wird, wird ein Segmentobjekt wird stattdessen erstellt, und auf __getitem__() stattdessen übergeben.

Python 3 nicht unterstützt __getslice__(), mehr, sondern es constructs a slice() Objekt für alle der oben genannten Scheibe Ausdrücke. Und slice() hat None als Standard:

Hinweis: Schneiden erfolgt ausschließlich mit den folgenden drei Methoden. Ein Aufruf wie

a[1:2] = b

wird

übersetzt

a[slice(1, 2, None)] = b

und so weiter. Fehlende Slice-Elemente werden immer mit None ausgefüllt.

Verwandte Themen