2015-08-24 14 views
9

quindi cercavo in qualche code on-line e mi sono imbattuto in una linea (alla linea 286):
if depth > 0 and best <= -MATE_VALUE is None and nullscore > -MATE_VALUE:
Gli operatori di confronto e 'is' - la precedenza degli operatori in python?

La parte che ho avuto difficoltà a capire era il best <= -MATE_VALUE is None.

Quindi ho attivato l'interprete per vedere come funziona una dichiarazione come value1 > value2 is value3.
Così ho provato

>>> 5 > 2 is True 
False 

>>> (5 > 2) is True 
True 

>>> 5 > (2 is True) 
True 


La mia domanda

Perché non è 5 > 2 is TrueTrue? E come funzionano generalmente queste cose?

Grazie.

+3

Cercare la concatenazione dell'operatore. Questo non è in realtà un problema di precedenza. Il primo è trattato logicamente come '(5> 2) && (2 is True)', che è il motivo/come Python consente un costrutto 'a user2864740

+1

http://stackoverflow.com/questions/25753474/python-comparison-operators-chaining-grouping-left-to-right, http://stackoverflow.com/questions/101268/hidden-features-of-python/101945 # 101945, http: // StackOverflow.it/questions/25103085/chaining-is-operators, http://stackoverflow.com/q/6074018/2864740 – user2864740

+3

FWIW, questa linea mi sembra molto strana - non mi è chiaro quando questa espressione sarà mai vera. Se MATE_VALUE è un numero (che presumibilmente è dovuto a '-MATE_VALUE'), allora non sarà mai None (se lo fosse, il' -' non funzionerebbe.) Quindi se la riga non genera un'eccezione, non restituirà sempre False? – DSM

risposta

7

Stai vedendo operatore concatenamento di pitone di lavoro

5 > 2 is True 

equivale a

5>2 and 2 is True 

Si può vedere questo in quanto

>>> 5>2 is 2 

Returns True.

3

Innanzitutto, 5 > 2 is True equivale a (5 > 2) and (2 is True) a causa della concatenazione dell'operatore in python (sezione 5.9 here).

È chiaro che 5 > 2 restituisce True. Tuttavia, 2 is True verrà valutato su False poiché non viene convertito implicitamente in bool. Se imposti la conversione, troverai che bool(2) is True produce True. Altre affermazioni come la dichiarazione if faranno questa conversione per te, quindi if 2: funzionerà.

In secondo luogo, v'è una differenza importante tra la is operatore e l'== dell'operatore (tratto da here):

Usa is quando si desidera controllare contro l'identità di un oggetto (ad esempio controllo per vedere if var is None) . Utilizzare == quando si desidera controllare l'uguaglianza (ad esempio var è uguale a 3?).

>> [1,2] is [1,2] 
False 

>> [1,2] == [1,2] 
True 

Anche se questo non ha un impatto immediato su questo esempio, si dovrebbe tenere a mente per il futuro.

Problemi correlati