In [32]: object() > 0
Out[32]: True
W rzeczywistości jest większy niż jakakolwiek liczba całkowita, którą próbowałem.Dlaczego "object()> 0" jest prawdziwe w Pythonie?
In [32]: object() > 0
Out[32]: True
W rzeczywistości jest większy niż jakakolwiek liczba całkowita, którą próbowałem.Dlaczego "object()> 0" jest prawdziwe w Pythonie?
Ponieważ Python 2.x próbował udostępnić porównanie obiektów różnych typów (nawet jeśli nie mają one sensu).
została ona ustalona na Python 3:
>>> object() > 0
Traceback (most recent call last):
File "<pyshell#320>", line 1, in <module>
object() > 0
TypeError: unorderable types: object() > int()
Kolejność stosowany w Pythonie 2.x:
None < Numbers < [Other types in alphabetical order]
Liczby są: int
, bool
i float
ale nie complex
, ponieważ nie mogą być porównywane:
Ponadto obiekty ze starych klas stylu (obiekty o numerach instance
) pozostań między None
i Numbers
z jakiegoś dziwnego powodu.
To prawda, że z szerokiej perspektywy porównywanie różnych typów obiektów nie ma sensu, ale dobrze jest móc sortować heterogeniczne typy i uzyskiwać spójne porządkowanie. –
@JBernardo Czy mógłbyś dodać link do pokrewnej sekcji w dokumentacji Python2.x? – satoru
@ Satoru.Logic Oto [link] (http://docs.python.org/library/stdtypes.html#comparisons). Przeczytaj pole "Szczegóły implementacji CPython" – JBernardo
To porównanie adresu obiektu z. Jeśli znasz C/C++, jest to arytmetyka wskaźnika.
>>> object() < object()
True
>>> object() > object()
False
W pierwszym przykładzie, pierwszy przedmiot() dzieje się wydane wcześniej w pamięci od drugiej, a więc nie jest „poniżej” innych.
Niezależnie od tego nie powinieneś porównywać takich wskaźników. :)
Możesz to potwierdzić, używając funkcji 'id' (http://docs.python.org/library/functions.html#id). tj .: id (object()) zwróci liczbę całkowitą. Jest to wartość używana do porównania do zera. – stderr
Czyni to dla dwóch obiektów tego samego typu, które nie mają zdefiniowanego porównania, ale dla obiektów różnych typów odpowiedź JBernardo jest poprawna. –
jakie są twoje oczekiwania? równy? – Takahiro
@ eric.f Błąd, oczywiście. – satoru