2013-11-04 13 views
5

Sono nuovo di Python e mentre provo le istruzioni logiche di Python. Mi sono imbattuto in ciò che non sono in grado di capire. Qualcuno può dirmi cosa sta succedendo qui in Python 2.7. Qual è la differenza tra 0 e Valore falso in Python.Confusione booleana di Python

 
>>> 0 or False 
False 
>>> False or 0 
0 

Perché l'interprete sta dando risposte diverse?

+0

Si noti che entrambi questi valori sono "falsy"; cioè, entrambi valutano "False" in un'istruzione if. –

risposta

6

Si sta confondendo il comportamento dell'operatore or; restituisce la prima espressione che solo se è un valore vero; né 0False vale quindi il secondo valore è restituito:

>>> 0 or 'bar' 
'bar' 
>>> False or 'foo' 
'foo' 

Qualsiasi valore non è numerico 0, un contenitore vuoto, None o False è considerato true (classi personalizzate possono alterare che implementando un metodo __bool__ (pitone 3), __nonzero__ (pitone 2) o __len__ (lunghezza 0 è vuoto)

la seconda espressione non è nemmeno valutato se la prima è True:.

>>> True or 1/0 
True 

L'espressione 1/0 genererebbe un'eccezione ZeroDivision, ma non è nemmeno valutata da Python.

Questo è documentato nella boolean operators documentation:

L'espressione x or y valuta prima x; se x è true, viene restituito il suo valore; in caso contrario, viene valutato e viene restituito il valore risultante.

Analogamente, and restituisce la prima espressione se è False, altrimenti viene restituita la seconda espressione.

+0

"Restituisce la prima espressione vera" Qui in 0 o Falso Quanto falso è vero? –

+0

Non mi piace questa risposta perché la giustificazione "restituisce la prima espressione vera" non spiega completamente il comportamento.Qualcosa come "passa attraverso gli operandi e restituisce la prima espressione che è Vero, o l'ultimo operando incontrato", mentre meno elegante, spiegherebbe meglio il comportamento incontrato. –

+0

@WaleedKhan: corretto il testo. –

1

La natura di questo comportamento è nell'ordine di Python expression evaluation. Python valuta le espressioni da sinistra a destra, e lo fa in un lazy manner. Ciò significa che l'interprete raggiunge il punto in cui il valore dell'espressione è True, indipendentemente dal resto dell'espressione, seguirà il ramo del flusso di lavoro, associato all'espressione. Se nessuna delle espressioni è True, restituirà semplicemente la più recente (l'ultima). Ciò offre i vantaggi del salvataggio di risorse computazionali. Si consideri il seguente codice:

>>>False or False or True or range(10**8) 
True 
>>> 

nota, che range(10**8) non è mai chiamato in questo caso, quindi, un sacco di tempo viene salvato.