З посібника python 2 :
Деталі реалізації CPython: Об'єкти різних типів, крім чисел, упорядковуються за їх назвами типів; об'єкти одного типу, які не підтримують належне порівняння, упорядковуються за їхньою адресою.
При замовленні двох рядків або двох числових типів упорядкування виконується очікуваним способом (лексикографічне впорядкування рядків, впорядкування чисел для цілих чисел).
Коли ви замовляєте числовий і нечисловий тип, на перше місце виходить числовий тип.
>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
Коли ви замовляєте два несумісні типи, де жоден не є числовим, вони впорядковуються в алфавітному порядку їх назв:
>>> [1, 2] > 'foo' # 'list' < 'str'
False
>>> (1, 2) > 'foo' # 'tuple' > 'str'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
Один виняток - класи старого стилю, які завжди стоять перед класами нового стилю.
>>> class Foo: pass # old-style
>>> class Bar(object): pass # new-style
>>> Bar() < Foo()
False
Чи така поведінка обумовлена специфікацією мови, чи це залежить від виконавців?
Немає мовної специфікації . Посилання на мову говорить:
В іншому випадку об'єкти різних типів завжди порівнюють неоднаково і впорядковуються послідовно, але довільно.
Отже, це деталь реалізації.
Чи є відмінності між будь-якими основними реалізаціями Python?
Я не можу відповісти на це, тому що я використовував лише офіційну реалізацію CPython, але є й інші реалізації Python, такі як PyPy.
Чи є відмінності між версіями мови Python?
У Python 3.x поведінку було змінено так, що спроба впорядкувати ціле число та рядок призведе до помилки:
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()