Cuplikan berikut ini dijelaskan dengan output ( seperti yang terlihat di ideone.com ):
print "100" < "2" # True
print "5" > "9" # False
print "100" < 2 # False
print 100 < "2" # True
print 5 > "9" # False
print "5" > 9 # True
print [] > float('inf') # True
print () > [] # True
Adakah yang bisa menjelaskan mengapa outputnya seperti itu?
Detail implementasi
- Apakah perilaku ini diamanatkan oleh spesifikasi bahasa, atau hanya untuk implementator?
- Apakah ada perbedaan antara implementasi Python utama?
- Apakah ada perbedaan antara versi bahasa Python?
python
types
comparison
python-2.x
polygenelubricants
sumber
sumber
Jawaban:
Dari manual python 2 :
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.
Saat Anda memesan dua jenis yang tidak kompatibel di mana tidak ada angka, mereka dipesan berdasarkan urutan abjad dari nama pengetik mereka:
Satu pengecualian adalah kelas gaya lama yang selalu datang sebelum kelas gaya baru.
Tidak ada spesifikasi bahasa . The referensi bahasa mengatakan:
Jadi ini adalah detail implementasi.
Saya tidak bisa menjawab yang ini karena saya hanya menggunakan implementasi CPython resmi, tetapi ada implementasi lain dari Python seperti PyPy.
Dalam Python 3.x perilaku telah diubah sehingga upaya untuk memesan integer dan string akan memunculkan kesalahan:
sumber
complex(1,0) > 'abc'
adalahFalse
tetapicomplex(1,0) > complex(0,0)
menimbulkanTypeError
String yang dibandingkan leksikografis, dan jenis berbeda dibandingkan dengan nama jenis mereka (
"int"
<"string"
). 3.x memperbaiki poin kedua dengan membuatnya tidak dapat dibandingkan.sumber