À partir du manuel de python 2 :
Détail de l'implémentation de CPython: les objets de différents types à l'exception des nombres sont classés par leur nom de type; les objets du même type qui ne prennent pas en charge la comparaison appropriée sont classés par leur adresse.
Lorsque vous commandez deux chaînes ou deux types numériques, l'ordre est effectué de la manière attendue (ordre lexicographique pour la chaîne, ordre numérique pour les entiers).
Lorsque vous commandez un type numérique et un type non numérique, le type numérique vient en premier.
>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
Lorsque vous commandez deux types incompatibles où aucun n'est numérique, ils sont classés par ordre alphabétique de leurs noms de types:
>>> [1, 2] > 'foo'
False
>>> (1, 2) > 'foo'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
Une exception concerne les classes de style ancien qui précèdent toujours les classes de style nouveau.
>>> class Foo: pass
>>> class Bar(object): pass
>>> Bar() < Foo()
False
Ce comportement est-il imposé par la spécification du langage ou appartient-il aux implémenteurs?
Il n'y a pas de spécification de langue . La référence linguistique dit:
Sinon, les objets de types différents se comparent toujours de manière inégale et sont ordonnés de manière cohérente mais arbitraire.
C'est donc un détail de mise en œuvre.
Existe-t-il des différences entre les principales implémentations de Python?
Je ne peux pas répondre à celle-ci car je n'ai utilisé que l'implémentation officielle de CPython, mais il existe d'autres implémentations de Python telles que PyPy.
Existe-t-il des différences entre les versions du langage Python?
Dans Python 3.x, le comportement a été modifié de sorte que la tentative de tri d'un entier et d'une chaîne lèvera une erreur:
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()