Das folgende Snippet ist mit der Ausgabe versehen ( wie auf ideone.com zu sehen ):
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 jemand erklären, warum die Ausgabe als solche ist?
Implementierungsdetails
- Wird dieses Verhalten von der Sprachspezifikation vorgegeben oder liegt es an den Implementierern?
- Gibt es Unterschiede zwischen den wichtigsten Python-Implementierungen?
- Gibt es Unterschiede zwischen Versionen der Python-Sprache?
python
types
comparison
python-2.x
Polygenschmierstoffe
quelle
quelle
Antworten:
Aus dem Python 2-Handbuch :
Wenn Sie zwei Zeichenfolgen oder zwei numerische Typen bestellen, erfolgt die Reihenfolge wie erwartet (lexikografische Reihenfolge für Zeichenfolge, numerische Reihenfolge für Ganzzahlen).
Wenn Sie einen numerischen und einen nicht numerischen Typ bestellen, steht der numerische Typ an erster Stelle.
Wenn Sie zwei inkompatible Typen bestellen, bei denen keiner numerisch ist, werden sie nach der alphabetischen Reihenfolge ihrer Typnamen sortiert:
Eine Ausnahme bilden Klassen im alten Stil, die immer vor Klassen im neuen Stil stehen.
Es gibt keine Sprachspezifikation . Die Sprachreferenz sagt:
Es ist also ein Implementierungsdetail.
Ich kann diese Frage nicht beantworten, da ich nur die offizielle CPython-Implementierung verwendet habe, aber es gibt andere Implementierungen von Python wie PyPy.
In Python 3.x wurde das Verhalten so geändert, dass der Versuch, eine Ganzzahl und eine Zeichenfolge zu bestellen, einen Fehler auslöst:
quelle
complex(1,0) > 'abc'
istFalse
abercomplex(1,0) > complex(0,0)
erhöht einTypeError
Zeichenfolgen werden lexikografisch verglichen, und unterschiedliche Typen werden anhand des Namens ihres Typs (
"int"
<"string"
) verglichen . 3.x behebt den zweiten Punkt, indem es sie nicht vergleichbar macht.quelle