2012-08-09 8 views
9

ho incontrato un po 'di codice che legge:C'è qualche differenza tra `se bool (x)` e `se x` in Python?

if bool(x): 
    doSomething 

Penso che la seguente avrebbe fatto lo stesso lavoro:

if x: 
    doSomething 

The reference dice che valuta la suite se l'espressione di prova

è trovato per essere vero

Il riferimento dice di espressioni booleane:

Nel contesto delle operazioni booleane, ed anche quando le espressioni sono utilizzate da rendiconto di controllo vengono utilizzati da dichiarazioni di flusso di controllo, i seguenti valori sono interpretati come falsa: False , Nessuno, zero numerico di tutti i tipi e stringhe vuote e contenitori ... Tutti gli altri valori sono interpretati come veri.

La reference dice della funzione bool():

convertire un valore per un valore booleano, utilizzando la procedura di prova verità di serie

lo sono anche i due sopra identici o c'è qualche extra sottigliezza ad esso?

+1

Basta seguire il primo collegamento nei documenti su se e avrai la tua risposta. – phant0m

+2

So cosa dice il riferimento. Ecco perché l'ho citato. Come dice il riferimento, non è una specifica, e sto chiedendo se la mia lettura dei documenti è corretta. – Joe

+0

No, ti collega a _ _nonzero() _ _ – phant0m

risposta

7

if utilizzerà __nonzero__() se disponibile, così come bool() quando si verifica un valore per la verità. Quindi , il comportamento è equivalente.

Dalla documentazione:

Nel contesto delle operazioni booleane, ed anche quando le espressioni sono utilizzati dalle istruzioni di controllo del flusso, i seguenti valori sono interpretati come falso: False, None, numerico pari a zero di tutti tipi e stringhe vuote e contenitori (comprese stringhe, tuple, liste, dizionari, set e frozensets). Tutti gli altri valori sono interpretati come veri. (Vedere la __nonzero__() metodo speciale di un modo per cambiare questo.)

object.__nonzero__(self)

Chiamato per implementare i test valore di verità e il built-in funzione bool(); dovrebbe restituire False o True, o i loro interi equivalenti 0 o 1. Quando questo metodo non è definito, viene chiamato __len__(), se è definito, e l'oggetto è considerato true se il suo risultato è diverso da zero. Se una classe non definisce né __len__()__nonzero__(), tutte le sue istanze sono considerate vere.

+1

Questa non era la prima risposta, ma contiene un collegamento categoriale tra le funzioni 'if' e' bool() ', quindi marcatura corretta. – Joe

+2

'__nonzero__' è noto come' __bool__' in python 3.x. – Darthfett

14

Gli oggetti vengono convertiti in modo implicito in tipo bool quando sono inseriti in un'istruzione if. Pertanto, per la maggior parte degli scopi, non c'è differenza tra x e bool(x) in una dichiarazione if. Tuttavia, se si chiama bool() perché si sta effettuando una chiamata di funzione, si verificheranno spese generali aggiuntive. Ecco un rapido test per dimostrare questo:

In [7]: %timeit if(''): pass 
10000000 loops, best of 3: 21.5 ns per loop 

In [8]: %timeit if(bool('')): pass 
1000000 loops, best of 3: 235 ns per loop 
+2

il tuo codice ha pedine di loop non corrispondenti ... uno è 10.000.000 l'altro è 1.000.000 –

+6

@InbarRose: no, questo è solo quante volte 'timeit' in loop. Decise di fare meno nel secondo caso perché era 10 volte più lento. Il 'per loop' è il numero importante. – DSM

+0

@DSM oh, ok :) –

3

qualsiasi oggetto che si inserisce in un if dichiarazione verrà convertito in un bool sulla base di alcuni checker pitone interna, normalmente non è un problema, non v'è alcuna differenza tra bool(x) e (x) quando si trova all'interno di una dichiarazione if.

tuttavia, la ragione bool(x) esiste è per casi come:

return bool(x)

che restituire "true o false" in base all'oggetto.

0

Afaik non vi è alcuna differenza, se x è o '', None, 0 o False sarà convertito in False.

+1

E '[]' e '{}' e 'set()' e ... la lista continua. (Qualsiasi oggetto può essere definito con un metodo '__nonzero__' (o' __bool__' per Python 3) e questo controlla il comportamento di 'if x'.) – huon

Problemi correlati