2014-11-09 12 views
18

Sto provando a indovinare quale operatore ha priorità: > (maggiore di) o == (uguale). Questo è il mio esperimento:Priorità degli operatori:> e ==

>>> 5 > 4 == 1 
False 

Per quanto ne so, questo ha due possibili soluzioni.

>>> (5 > 4) == 1 
True 
>>> 5 > (4 == 1) 
True 

Né si ritorna False, così come è il primo codice risolto da Python?

+0

Si potrebbe cercare questo in su, ma uno per essere interrogato un (forse) risultato controintuitivo. – imallett

risposta

27

Questo ha a che fare con il concatenamento dell'operatore. A differenza di C/C++ e della maggior parte degli altri linguaggi, Python consente di mettere in catena operatori di confronto proprio come faresti nella matematica normale. Dalla documentation:

confronti possono essere concatenati arbitrariamente, ad esempio, x < y <= z è equivalente a x < y and y <= z, tranne che y viene valutata solo una volta (ma in entrambi i casi z è non valutato affatto quando x < y si trova ad essere false).

Quindi, questa espressione:

5 > 4 == 1 

è effettivamente interpretato come:

5 > 4 and 4 == 1 # Except that 4 is only evaluated once. 

che diventa:

True and False 

che è False.


L'utilizzo di parentesi tuttavia modifica il modo in cui Python interpreta il confronto. Questo:

(5 > 4) == 1 

diventa:

True == 1 

che è True (vedi sotto per il motivo). Lo stesso vale per:

5 > (4 == 1) 

che diventa:

5 > False 

che è anche True.


A causa di PEP 0285, bool è stata fatta una sottoclasse di int e True == 1 mentre False == 0:

>>> issubclass(bool, int) 
True 
>>> True == 1 
True 
>>> False == 0 
True 
>>> 
+0

Ecco un collegamento alla documentazione, solo per riferimento: https://docs.python.org/2/reference/expressions.html#boolean-operations –

+2

@iCodez l'interpretazione con concatenamento è 5> 4 e 4 == 1 – ryanpattison

+0

Interessante!Molte grazie. – cdonts