Python 2, string ve int'i nasıl karşılaştırır? Listeler neden sayılardan daha büyük ve listelerden daha büyük tuples karşılaştırıyor?


178

Aşağıdaki snippet, çıktıyla birlikte açıklanır ( ideone.com'da görüldüğü gibi ):

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

Birisi çıktının neden böyle olduğunu açıklayabilir mi?


Uygulama ayrıntıları

  • Bu davranış dil spekülasyonu tarafından zorunlu kılınıyor mu yoksa uygulayıcılara mı bağlı?
  • Önemli Python uygulamaları arasında herhangi bir fark var mı?
  • Python dilinin sürümleri arasında farklar var mı?

23
Bu sorunun 3000 dups ki, bu bir açıklayan bir cevabı var neden dil bu şekilde dizayn edilmiştir (ve 3.x yeniden tasarlandı neden). Bu, bu sorunun bir parçası değildir, ancak burada bağlantılı olan birçok sorunun bir parçasıdır.
abarnert

Yanıtlar:


209

Gönderen piton 2 kılavuzun :

CPython uygulama ayrıntıları: Sayılar dışında farklı türdeki nesneler tür adlarına göre sıralanır; uygun karşılaştırmayı desteklemeyen aynı türdeki nesneler adreslerine göre sıralanır.

İki dize veya iki sayısal tür sipariş ettiğinizde, sıralama beklenen şekilde yapılır (dize için sözlükbilimsel sıralama, tamsayılar için sayısal sıralama).

Sayısal ve sayısal olmayan bir tür sipariş ettiğinizde, önce sayısal tür gelir.

>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True

Hiçbiri sayısal olmayan iki uyumsuz tür sipariş ettiğinizde, bunlar türlerinin adlarının alfabetik sırasına göre sıralanır:

>>> [1, 2] > 'foo'   # 'list' < 'str' 
False
>>> (1, 2) > 'foo'   # 'tuple' > 'str'
True

>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True

Bir istisna, her zaman yeni stil sınıflarından önce gelen eski stil sınıflarıdır.

>>> class Foo: pass           # old-style
>>> class Bar(object): pass   # new-style
>>> Bar() < Foo()
False

Bu davranış dil spekülasyonu tarafından zorunlu kılınıyor mu yoksa uygulayıcılara mı bağlı?

Orada hiçbir dil belirtimi . Dil referans diyor ki:

Aksi takdirde, farklı türdeki nesneler her zaman eşitsizdir ve tutarlı ama keyfi olarak sıralanır.

Yani bir uygulama detayı.

Önemli Python uygulamaları arasında herhangi bir fark var mı?

Buna cevap veremem çünkü sadece resmi CPython uygulamasını kullandım, ancak Python'un PyPy gibi başka uygulamaları da var.

Python dilinin sürümleri arasında farklar var mı?

Python 3.x'te, bir tamsayı ve bir dize sipariş etmeye çalıştığınızda bir hata oluşacak şekilde davranış değiştirildi:

>>> '10' > 5
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    '10' > 5
TypeError: unorderable types: str() > int()

55
Py3k'te değiştirmeleri iyi oldu. Bu soruyu ilk gördüğümde düşüncelerim 'ne, bu bir hata yaratmıyor mu?'
JAL

9
Not: Farklı türlerin tür adına göre sıralandığına dair 2.x kuralının bir istisnası, None nesnesinin her zaman diğer tüm türlerden daha az karşılaştırmasıdır. 3.x'te None'ı başka bir türle karşılaştırmak yine de TypeError değerini yükseltir.
Dave Kirby

4
@KarelBilek: bool sayısal bir tür. Ve True == 1 yani ne <ne de>.
abarnert

3
Tür adlarının sözcük bilgisi sırası? Bunun ne zaman bir özellik olmasını istersiniz? Bunu kim kullanacak?
Jack

3
Eğlenceli bir gerçek: complex(1,0) > 'abc'olduğunu Falseancak complex(1,0) > complex(0,0)bir yükseltirTypeError
Eric Duminil

24

Dizeler sözlükbilimsel olarak karşılaştırılır ve farklı türler türlerinin adlarıyla karşılaştırılır ( "int"< "string"). 3.x ikinci noktayı karşılaştırılamaz yaparak düzeltir.


3
Python2 int's dikte daha az yani sadece tür adıyla sözlükbilimsel olamaz?
Tony Suffolk 66

Bu yanıta geldim ve Tony Suffolk ile aynı fikirdeyim. Farklı olduğunda nesneler tür adına göre sıralanmaz.
Exelian

@ TonySuffolk66 sayısal türü bu kuralın istisnasıdır. NumericType 2.7'de her zaman diğer türlerden (NoneType hariç) daha düşüktür.
lef
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.