Dari manual python 2 :
Detail implementasi CPython: Objek dengan tipe yang berbeda kecuali angka diurutkan berdasarkan nama tipenya; objek dari jenis yang sama yang tidak mendukung perbandingan yang tepat dipesan oleh alamatnya.
Ketika Anda memesan dua string atau dua jenis numerik, pemesanan dilakukan dengan cara yang diharapkan (pemesanan leksikografis untuk string, pemesanan numerik untuk bilangan bulat).
Saat Anda memesan tipe numerik dan non-numerik, tipe numerik yang lebih dulu.
>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
Saat Anda memesan dua jenis yang tidak kompatibel di mana tidak ada angka, mereka dipesan berdasarkan urutan abjad dari nama pengetik mereka:
>>> [1, 2] > 'foo' # 'list' < 'str'
False
>>> (1, 2) > 'foo' # 'tuple' > 'str'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
Satu pengecualian adalah kelas gaya lama yang selalu datang sebelum kelas gaya baru.
>>> class Foo: pass # old-style
>>> class Bar(object): pass # new-style
>>> Bar() < Foo()
False
Apakah perilaku ini diamanatkan oleh spesifikasi bahasa, atau hanya untuk implementator?
Tidak ada spesifikasi bahasa . The referensi bahasa mengatakan:
Kalau tidak, objek dari tipe yang berbeda selalu membandingkan tidak sama, dan dipesan secara konsisten tetapi sewenang-wenang.
Jadi ini adalah detail implementasi.
Apakah ada perbedaan antara implementasi Python utama?
Saya tidak bisa menjawab yang ini karena saya hanya menggunakan implementasi CPython resmi, tetapi ada implementasi lain dari Python seperti PyPy.
Apakah ada perbedaan antara versi bahasa Python?
Dalam Python 3.x perilaku telah diubah sehingga upaya untuk memesan integer dan string akan memunculkan kesalahan:
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()