Dal manuale di python 2 :
Dettagli dell'implementazione di CPython: gli oggetti di tipi diversi, tranne i numeri, sono ordinati in base al nome del tipo; oggetti dello stesso tipo che non supportano il confronto corretto sono ordinati in base al loro indirizzo.
Quando ordini due stringhe o due tipi numerici, l'ordinamento viene eseguito nel modo previsto (ordinamento lessicografico per stringa, ordinamento numerico per numeri interi).
Quando ordini un tipo numerico e non numerico, il tipo numerico viene prima.
>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
Quando ordini due tipi incompatibili in cui nessuno dei due è numerico, vengono ordinati in base all'ordine alfabetico dei loro nomi:
>>> [1, 2] > 'foo' # 'list' < 'str'
False
>>> (1, 2) > 'foo' # 'tuple' > 'str'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
Un'eccezione sono le lezioni di vecchio stile che vengono sempre prima delle lezioni di nuovo stile.
>>> class Foo: pass # old-style
>>> class Bar(object): pass # new-style
>>> Bar() < Foo()
False
Questo comportamento è richiesto dalle specifiche della lingua o dipende dagli implementatori?
Non ci sono specifiche di lingua . Il riferimento linguistico dice:
Altrimenti, oggetti di diverso tipo si confrontano sempre in modo diseguale e sono ordinati in modo coerente ma arbitrario.
Quindi è un dettaglio di implementazione.
Ci sono differenze tra le principali implementazioni di Python?
Non posso rispondere a questo perché ho usato solo l'implementazione ufficiale di CPython, ma ci sono altre implementazioni di Python come PyPy.
Ci sono differenze tra le versioni del linguaggio Python?
In Python 3.x il comportamento è stato modificato in modo che il tentativo di ordinare un numero intero e una stringa genererà un errore:
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()