2010-03-05 12 views
33

:Neden ''> 0 Python'da Doğru? Python 2.6.4 yılında

>> ''>0 
True 

Bunun nedeni nedir?

+21

BTW, Python 3.0, aynı karşılaştırma için bir 'TypeError: değiştirilemez türleri: str()> int()' üretir – mjv

+0

İlgili http://stackoverflow.com/questions/18387938/how-do-python- karşılaştırma-operatörler-ve-iş-ile-bir-işlev-adı-bir-opera olarak – Kasramvd

cevap

71

gelen keyfi nesnelerin sipariş karşılaştırmalar izin verdiği için orijinal tasarım motivasyon heterojen listelerinin sıralama izin vermekti - Bir sonraki alfabetik sırayla birbirlerine tüm dizeleri koymak olacağını, yararlı ve Sayısal sıralamada birbirinin yanındaki tüm sayılar, iki bloktan hangisinin önce geldiği dil tarafından garanti edilmemiştir. Örneğin, bu, O(N log N) en kötü durumda

içinde herhangi bir listede yalnızca benzersiz öğelerin (yıkanabilir olmayan öğelerle bile) alınmasına izin verdi. Yıllar içinde bu pragmatik düzenleme aşınmış. İlk çatlak, karmaşık sayıları sıralama-karşılaştırma yeteneğinin, birkaç versiyon önce alındığı zaman geldi. Aniden, herhangi bir listesinin sıralanması yeteneği ortadan kalktı: liste, başka türdeki öğelerle birlikte, karmaşık sayılar içeriyorsa, artık geçerli değildi. Daha sonra Guido daha heterojen listeleri daha genel olarak beğenmeye başladı ve böylece bu tür listeler yararlı bir şekilde sıralanabilseydi, gerçekten madde maddesi olmadığını düşünmeye başladılar ... çünkü bu tür listeler yeni düşüncesine göre ilk sırada yer almamalı. . Onları yasaklamak için hiçbir şey yapmadı, ama onları desteklemek için herhangi bir taviz vermeyi kabul etmedi.

Not karmaşık sayılar hala siparişe göre ;-) – olabilecekken hem değişiklikleri geri önceki yazılmıştır Python Zen "pratiklik yener saflık" öğesi (gelen biraz uzakta dengeyi hareket ettiklerini biraz daha fazla saflık, biraz daha az pratiklik. Bununla birlikte, iki rasgele nesneyi (sipariş sayısı karmaşık bir sayı olmaksızın ;-) uzun bir süre boyunca kaldığı sürece) karşılaştırma kabiliyeti, çünkü aynı zamanda Guido, güçlü geriye dönük uyumluluğun sürdürülmesinde gerçekten ısrar etmeye başladı. hem pratik ve saf ;-).

Bu nedenle, yalnızca bazı uzun istenen ancak geriye dönük uyumsuz geliştirmelere izin vermek için güçlü geriye dönük uyumluluğun kısıtlamasının açıkça ve kasıtlı olarak kaldırıldığı Python 3'te (özellikle basitleştirmeler ve belirli görevleri gerçekleştirmenin gereksiz bir şekilde kaldırılması), Farklı tipteki örneklerin sipariş karşılaştırması bir hata oldu.

Bu tarihsel ve felsefi tez çalışması temelde "neden" sorusuna gerçekten cevap vermenin tek yoludur ...! :-)

+1

'da buna artık izin vermeyecek şekilde yenilenmesi, dilin artık bu özelliğe sahip olmasa da, isteğe bağlı listelerin sıralamasının özel bir karşılaştırıcı ile kolayca kapatılabileceğini eklemelidir. İhtiyacın olması durumunda kendiniz yazmanız yeterli olacaktır - aynı zamanda çok pratik bir yaklaşım olacaktır. – Trilarion

+0

Not: Python 2'de, karmaşık bir sayı başka bir karmaşık sayı haricinde başka herhangi bir nesneyle karşılaştırılabilir! karmaşık (1,0)> 'abc', 'False'dir, ancak karmaşık (1,0)> karmaşık (0,0)' 'TypeError'ı yükseltir –

21

https://docs.python.org/2.7/tutorial/datastructures.html#id1

Note that comparing objects of different types is legal. The outcome is deterministic but arbitrary: the types are ordered by their name. Thus, a list is always smaller than a string, a string is always smaller than a tuple, etc. [1] Mixed numeric types are compared according to their numeric value, so 0 equals 0.0, etc.

+6

Garip. Python 3.0 –