Aus dem Python 2-Handbuch :
CPython-Implementierungsdetail: Objekte unterschiedlicher Typen mit Ausnahme von Nummern werden nach ihren Typnamen sortiert. Objekte desselben Typs, die keinen ordnungsgemäßen Vergleich unterstützen, werden nach ihrer Adresse sortiert.
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.
>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
Wenn Sie zwei inkompatible Typen bestellen, bei denen keiner numerisch ist, werden sie nach der alphabetischen Reihenfolge ihrer Typnamen sortiert:
>>> [1, 2] > 'foo' # 'list' < 'str'
False
>>> (1, 2) > 'foo' # 'tuple' > 'str'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
Eine Ausnahme bilden Klassen im alten Stil, die immer vor Klassen im neuen Stil stehen.
>>> class Foo: pass # old-style
>>> class Bar(object): pass # new-style
>>> Bar() < Foo()
False
Wird dieses Verhalten von der Sprachspezifikation vorgegeben oder liegt es an den Implementierern?
Es gibt keine Sprachspezifikation . Die Sprachreferenz sagt:
Andernfalls werden Objekte unterschiedlicher Typen immer ungleich verglichen und sind konsistent, aber willkürlich geordnet.
Es ist also ein Implementierungsdetail.
Gibt es Unterschiede zwischen den wichtigsten Python-Implementierungen?
Ich kann diese Frage nicht beantworten, da ich nur die offizielle CPython-Implementierung verwendet habe, aber es gibt andere Implementierungen von Python wie PyPy.
Gibt es Unterschiede zwischen Versionen der Python-Sprache?
In Python 3.x wurde das Verhalten so geändert, dass der Versuch, eine Ganzzahl und eine Zeichenfolge zu bestellen, einen Fehler auslöst:
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()