Poniższy fragment kodu jest opatrzony adnotacjami do wyniku ( jak widać na 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
Czy ktoś może wyjaśnić, dlaczego dane wyjściowe są takie?
Szczegóły dotyczące wdrożenia
- Czy takie zachowanie jest wymagane przez specyfikację języka, czy też zależy od implementatorów?
- Czy są jakieś różnice między głównymi implementacjami języka Python?
- Czy istnieją różnice między wersjami języka Python?
python
types
comparison
python-2.x
środki smarujące wielotlenowe
źródło
źródło
Odpowiedzi:
Z podręcznika Python 2 :
Kiedy zamawiasz dwa ciągi lub dwa typy liczbowe, porządkowanie odbywa się w oczekiwany sposób (porządek leksykograficzny dla ciągu, porządek numeryczny dla liczb całkowitych).
Kiedy zamawiasz numeryczny i nieliczbowy typ, numeryczny jest na pierwszym miejscu.
Gdy zamawiasz dwa niezgodne typy, w których żaden nie jest numeryczny, są one uporządkowane według kolejności alfabetycznej ich nazw typów:
Jedynym wyjątkiem są klasy w starym stylu, które zawsze poprzedzają klasy w nowym stylu.
Nie ma specyfikacji języka . Odniesienia język mówi:
Jest to więc szczegół implementacji.
Nie mogę odpowiedzieć na to pytanie, ponieważ użyłem tylko oficjalnej implementacji CPython, ale są też inne implementacje Pythona, takie jak PyPy.
W Pythonie 3.x zachowanie zostało zmienione, dlatego próba zamówienia liczby całkowitej i ciągu spowoduje zgłoszenie błędu:
źródło
complex(1,0) > 'abc'
toFalse
jednakcomplex(1,0) > complex(0,0)
rodziTypeError
Ciągi są porównywane leksykograficznie, a różne typy są porównywane według nazwy ich typu (
"int"
<"string"
). 3.x naprawia drugi punkt, czyniąc je nieporównywalnymi.źródło