2012-07-19 17 views

Odpowiedz

12

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.

+2

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. –

+1

@JBernardo Czy mógłbyś dodać link do pokrewnej sekcji w dokumentacji Python2.x? – satoru

+1

@ Satoru.Logic Oto [link] (http://docs.python.org/library/stdtypes.html#comparisons). Przeczytaj pole "Szczegóły implementacji CPython" – JBernardo

2

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. :)

+0

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

+2

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. –

Powiązane problemy