2016-12-03 15 views
9

GeçenlerdePython 2 neden listeler ve sayılar arasındaki karşılaştırmaya izin veriyor?

while len(first_list) > second_list: 
    do_stuff 

Bununla etrafında oynanan ve 5 < ["apple"] == True ve

5 > ["apple"] == False Neden Python karşılaştırmaların bu tür izin vermez keşfetti benim programda bir yazım hatası keşfetti? Ne 5["apple"] daha az olduğunu belirlemek için kaputun altında değerlendirilmektedir?

+8

, size böyle bir karşılaştırma çalışırsanız bir istisna hangi Python 3 kullanmalıdır. – Delgan

cevap

4

Ben tipleri bu durumda karşılaştırılır düşünüyorum, bu yüzden yazılı gibi:

type(5) < type(["apple"]) 

ve "int" ve "liste" leksikografik karşılaştırılır beri

("i" < "l") kullanarak, Bu çıkışı alıyoruz.

Eğer denerseniz:

"5" > ["apple"] 

siz "dizesi"> "listesinde" çünkü yanlış alırsınız.

Documentation:

CPython uygulama detay: numaralar hariç farklı türde nesneler tiplerle tarafından sıralanır; Doğru karşılaştırmayı desteklemeyen aynı türdeki nesneler adreslerine göre sıralanır.

+0

Bunu gösteren herhangi bir belge veya kaynak kodu linki yararlı olacaktır. Bu olmadan sadece bir varsayım var –

+0

SO: [Python string ile int karşılaştırır] (http://stackoverflow.com/a/3270689/2291710) – Delgan

+2

Doğru değil. '{} <0'' – yelsayed

-3

this'a göre, farklı türlerin yalnızca karşılaştırılması gerekir, bununla nasıl başa çıkılacağına karar vermek için uygulamaya geçilir. Öyle ki, CPython'un uygulaması, tip isimlerine göre sipariş vermeye karar verir.

+0

Aşağı oyların herhangi bir nedeni var mı? – yelsayed

+0

downvotes muhtemelen bu cevap gerçekten bir şey cevap değil ama sadece tahminler ... ve aslında, uygulama için _not_ çünkü. – mb21

+0

Açıklamak ister misiniz? Resmi belgelerin neresinde bunu tanımlar? – yelsayed

3

Onun piton 2 dokümantasyonlarından:

operatörleri <, >, ==, >=, <= ve != iki nesne değerlerini karşılaştırın. Nesnelerin aynı tip olması gerekmez. Her ikisi de sayı ise, bunlar ortak bir türe dönüştürülür. Aksi takdirde, farklı türdeki nesneler her zaman eşitsiz bir şekilde karşılaştırır ve tutarlı bir şekilde ama keyfi olarak sıralanır. Bir __cmp__ yöntemini veya __gt__ gibi zengin karşılaştırma yöntemlerini tanımlayarak olmayan yerleşik türleri nesnelerin karşılaştırılması davranışını kontrol edebilirsiniz. Python 2 tasarımıyla bozuldu Çünkü