Wie funktioniert Python 2 zu vergleichen, string und int? Warum do-Listen zu vergleichen, da mehr als zahlen und Tupel größer als Listen?
Folgenden Ausschnitt versehen, der mit dem Ausgang (wie gesehen auf ideone.com):
print "100" < "2" # True
print "5" > "9" # False
print "100" < 2 # False
print 100 < "2" # True
print 5 > "9" # False
print "5" > 9 # True
print [] > float('inf') # True
print () > [] # True
Kann mir jemand erklären, warum die Ausgabe als solche?
Implementierungsdetails
- Ist dieses Verhalten gerechtfertigt durch die Sprache-Skillung, oder ist es bis zu implementors?
- Gibt es Unterschiede zwischen der großen Python-Implementierungen?
- Gibt es Unterschiede zwischen den Versionen der Python-Sprache?
Der 3000 dups dieser Frage, eins hat eine Antwort, erklären warum - die Sprache wurde auf diese Weise entworfen (und warum wurde es neu gestaltet 3.x). Das ist nicht Teil dieser Frage, sondern ist Teil des viele der Fragen, die hier verlinkt sind.
InformationsquelleAutor polygenelubricants | 2010-07-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der python 2-Handbuch:
Wenn Sie, um zwei Zeichenfolgen oder zwei numerischen Typen die Bestellung erfolgt in der erwarteten Weise (lexikographische Reihenfolge für die string -, numerischen Bestellung für ganze zahlen).
Wenn Sie die Reihenfolge ein numerischer und nicht-numerischer Datentyp, der numerische Typ kommt zuerst.
Wenn Sie um zwei inkompatible Typen wo keiner ist numerisch, Sie sind sortiert nach der alphabetischen Reihenfolge Ihrer typenames:
Einzige Ausnahme ist old-style-Klassen, die immer vor den new-style-Klassen.
Es ist keine Sprache-Spezifikation. Die Referenzhandbuch sagt:
Also es ist eine Implementierung detail.
Kann ich nicht beantworten, diese eine, weil ich habe nur die offizielle CPython-Implementierung, aber es gibt auch andere Implementierungen von Python wie PyPy.
In Python 3.x das Verhalten wurde so geändert, dass der Versuch der Ordnung einer ganzen Zahl und einem string wird ein Fehler ausgelöst:
N. B. Eine Ausnahme von der 2.x Regel, dass verschiedene Arten sind, geordnet nach den Namen der Art ist, dass die None-Objekt vergleicht immer nur weniger als jeder andere Typ. In 3.x vergleicht Keiner mit einem anderen Typ wird sich noch erhöhen, ein TypeError.
bool ist ein numerischer Typ. Und True==1 es ist also weder < noch >.
Lexographic Reihenfolge Ihrer Art-Namen? Wann würde Sie jemals wollen, dass dies ein feature sein? Wer würde jemals nutzen?
Fun fact :
complex(1,0) > 'abc'
istFalse
abercomplex(1,0) > complex(0,0)
wirft eineTypeError
InformationsquelleAutor Mark Byers
Strings sind im Vergleich lexikographisch, und unterschiedliche Arten verglichen werden mit dem Namen Ihrer Art (
"int"
<"string"
). 3.x behebt den zweiten Punkt mit Ihnen nicht vergleichbar.Ich kam gerade über diese Antwort und Stimme mit Tony Suffolk. Objekte sind NICHT geordnet, indem der name des Typs, wenn unterschiedlich.
numerischer Typ ist die Ausnahme zu dieser Regel. NumericType ist immer niedriger als jede andere Art (mit Ausnahme von NoneType) 2.7.
InformationsquelleAutor Ignacio Vazquez-Abrams