Z podręcznika Python 2 :
Szczegóły implementacji CPython: Obiekty różnych typów oprócz liczb są uporządkowane według nazw typów; obiekty tego samego typu, które nie obsługują właściwego porównania, są uporządkowane według ich adresu.
Kiedy zamawiasz dwa ciągi lub dwa typy liczbowe, porządkowanie odbywa się w oczekiwany sposób (porządek leksykograficzny dla ciągu, porządek numeryczny dla liczb całkowitych).
Kiedy zamawiasz numeryczny i nieliczbowy typ, numeryczny jest na pierwszym miejscu.
>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
Gdy zamawiasz dwa niezgodne typy, w których żaden nie jest numeryczny, są one uporządkowane według kolejności alfabetycznej ich nazw typów:
>>> [1, 2] > 'foo' # 'list' < 'str'
False
>>> (1, 2) > 'foo' # 'tuple' > 'str'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
Jedynym wyjątkiem są klasy w starym stylu, które zawsze poprzedzają klasy w nowym stylu.
>>> class Foo: pass # old-style
>>> class Bar(object): pass # new-style
>>> Bar() < Foo()
False
Czy takie zachowanie jest wymagane przez specyfikację języka, czy też zależy od implementatorów?
Nie ma specyfikacji języka . Odniesienia język mówi:
W przeciwnym razie obiekty różnych typów zawsze porównują nierówne i są uporządkowane konsekwentnie, ale arbitralnie.
Jest to więc szczegół implementacji.
Czy są jakieś różnice między głównymi implementacjami języka Python?
Nie mogę odpowiedzieć na to pytanie, ponieważ użyłem tylko oficjalnej implementacji CPython, ale są też inne implementacje Pythona, takie jak PyPy.
Czy istnieją różnice między wersjami języka Python?
W Pythonie 3.x zachowanie zostało zmienione, dlatego próba zamówienia liczby całkowitej i ciągu spowoduje zgłoszenie błędu:
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()