2012-05-03 21 views
26

Sto chiedendo questo perché so che il modo divinatorio per verificare se una lista è vuota o non è la seguente:Perché "[] == False" restituisce False quando "se non []" ha esito positivo?

my_list = [] 
if not my_list: 
    print "computer says no" 
else: 
    # my_list isn't empty 
    print "computer says yes" 

stamperà computer says no, ecc Quindi questo mi porta a identificare [] con False verità -valori; tuttavia, se provo a confrontare [] e False "direttamente", io ottenere il seguente:

>>> my_list == False 
False 
>>> my_list is False 
False 
>>> [] == False 
False 

ecc ...

cosa sta succedendo qui? Mi sento come se mi mancasse qualcosa di veramente ovvio.

+4

Questo è un ottimo design, in quanto anche i programmatori non usano la clausola 'if variable == True:'. Dovrebbe essere 'se la variabile è True:' (È esattamente True, non qualcos'altro - Non è il modo migliore di fare le cose nella maggior parte dei casi), o 'if variable' (è vero-y). – Darthfett

risposta

49

L'istruzione if valuta tutto in un contesto booleano, è come se ci fosse una chiamata implicita alla funzione integrata bool().

Ecco come si sarebbe effettivamente controllare come le cose saranno valutate da una if dichiarazione:

>>> bool([]) 
False 
>>> bool([]) == False 
True 

Vedere la documentazione sul Truth Value Testing, liste vuote sono considerati falsi, ma questo non significa che siano equivalente a False.

PEP 285 ha anche alcuni eccellenti informazioni sul perché è stato implementato in questo modo, vedere l'ultimo proiettile nelle Problemi risolti sezione per la parte che si occupa di x == True e x == False specifico.

L'aspetto più convincente per me è che == è generalmente transitiva, così a == b e b == c implica a == c. Quindi se fosse come previsto e [] == False erano veri e '' == False erano veri, si potrebbe supporre che [] == '' dovrebbe essere vero (anche se ovviamente non dovrebbe essere in una lingua senza conversione di tipo implicita).

+18

"Anche se ovviamente non dovrebbe essere," *** Javascript ***. –

13

I contenitori vuoti sono "falsi", ovvero valutano a Falsein un contesto booleano. Ciò non significa che siano letteralmente uguali alla costante False.

In altre parole, il seguente è True:

bool([]) == False 

Il valore di verità di un oggetto è determinato dalla sua __nonzero__() o il metodo __len__(). (In Python 3, __bool__() è stato rinominato in __bool__().) I contenitori hanno un metodo __len__(), quindi sono sinceri quando contengono qualcosa e falsi quando sono vuoti.

Se i contenitori vuoti erano letteralmente uguali a False, a proposito, qualsiasi contenitore vuoto sarebbe uguale a qualsiasi altro contenitore vuoto: ad esempio, {} == "" sarebbe True. E questo non avrebbe assolutamente senso!

Tuttavia, proprio a soffiare la vostra mente, il seguente è True:

False == 0 

Questo perché booleani sono una sottoclasse di numeri interi in Python, e False è fondamentalmente solo uno zero che viene stampato un po 'diverso.

7

I tipi predefiniti in Python hanno un valore di verità che consente di verificarli per verificarne la veridicità. Vedi Truth Value Testing.

Questo è diverso dal dire object == False che sta eseguendo un test del valore reale (test di uguaglianza). Sta usando il metodo oggetti __eq__() per determinare se i loro valori sono uguali.

+0

Trovo questa la risposta più utile, personalmente. La verità è un concetto interessante e può portare a conseguenze non intuitive. Prendi JavaScript e i suoi valori di fondo come esempio. – dwerner

+1

@dwerner: Sì, sono d'accordo. Cerco solo di pensarci come "se questo oggetto ha un contenuto" quando dico "se oggetto:" – jdi

3

Nell'esempio, l'operatore not sta causando la conversione del proprio elenco in un valore booleano. Prova questo:

>>> not [] 
True 

>>> not [1] 
False 

"is" e "==" non eseguire tale conversione.

+3

Questo è un punto davvero buono che l'operatore 'not' sta convertendo in un booleano, ma lo si fa all'indietro. '(not []) == True' e' (not [1]) == False'. –

+0

Grazie. Lo aggiusterò. –

Problemi correlati