2012-08-09 15 views
9

Ich habe über einige Code kommen, der lautet:Gibt es einen Unterschied zwischen `if bool (x)` und `if x` in Python?

if bool(x): 
    doSomething 

Ich denke, dass die folgenden die gleiche Arbeit tun würde:

if x: 
    doSomething 

The reference sagt, dass es die Suite, wenn der Testausdruck auswertet

gefunden um wahr zu sein

Der Referenz sagt von Booleschen Ausdrücken:

Im Rahmen der Boolesche Operationen, und auch wenn Ausdrücke, die durch Steuerflussrechnung verwendet werden, sind durch Steuerflussrechnung verwendet wird, werden die folgenden Werte interpretiert als falsch: False , Keine, numerische Null aller Typen und leere Strings und Container ... Alle anderen Werte werden als wahr interpretiert.

Die reference sagt der bool() Funktion:

Wert auf einen Boolean konvertieren, die Standard Wahrheit Testverfahren unter Verwendung von

So die beiden oben identisch sind oder gibt es eine Extra Subtilität zu ihm?

+1

Folgen Sie einfach dem ersten Link in der Dokumentation über, ob und Sie werden Ihre Antwort haben. – phant0m

+2

Ich weiß, was die Referenz sagt. Deshalb habe ich es zitiert. Wie die Referenz sagt, handelt es sich nicht um eine Spezifikation, und ich frage, ob mein Lesen der Dokumente korrekt ist. – Joe

+0

Nein, es verbindet Sie mit _ _nonzero() _ _ – phant0m

Antwort

7

if wird __nonzero__() wenn verfügbar, wie bool() beim Testen eines Wertes für die Wahrheit verwenden. So ja, das Verhalten ist gleichwertig.

Aus der Dokumentation:

Im Rahmen der Boolesche Operationen, und auch wenn Ausdrücke durch Steuerfluss-Anweisungen verwendet werden, werden die folgenden Werte interpretiert als falsch: False, None, numerisch Null aller Typen und leere Strings und Container (einschließlich Strings, Tupel, Listen, Wörterbücher, Sets und frozensets). Alle anderen Werte werden als wahr interpretiert. (Siehe __nonzero__() spezielle Methode für eine Art und Weise, dies zu ändern.)

object.__nonzero__(self)

Called Wahrheitswert Tests zu implementieren und den integrierten Betrieb bool(); sollte Falsch oder True zurück oder ihre Ganzzahläquivalente 0 oder 1. Wenn diese Methode nicht definiert ist, wird __len__() aufgerufen, wenn sie definiert ist, und das Objekt wird als wahr betrachtet, wenn sein Ergebnis ungleich Null ist. Wenn eine Klasse weder __len__() noch __nonzero__() definiert, werden alle ihre Instanzen als wahr betrachtet.

+1

Dies war nicht die erste Antwort, aber es enthält eine kategorische Verbindung zwischen die 'if'- und' bool() '-Funktionen, also richtig markiert. – Joe

+2

'__nonzero__' wird in Python 3.x als' __bool__' bezeichnet. – Darthfett

14

Objekte werden implizit in bool-Typ konvertiert, wenn sie in eine if-Anweisung gestellt werden. Für die meisten Zwecke gibt es keinen Unterschied zwischen x und bool(x) in einer if-Anweisung. Sie werden jedoch zusätzlichen Aufwand verursachen, wenn Sie bool() aufrufen, da Sie einen Funktionsaufruf ausführen. Hier ist ein kurzer Test dies zu demonstrieren:

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

Ihr Code hat nicht übereinstimmende Loop-Checker .... eins ist 10.000.000, das andere ist 1.000.000 –

+6

@InbarRose: Nein, das ist nur, wie oft Malit'looped. Es entschied sich, im zweiten Fall weniger zu tun, weil es 10 mal langsamer war. Die "per-Schleife" ist die wichtige Zahl. – DSM

+0

@DSM oh, okay :) –

3

jedes Objekt, das Sie in einer if Anweisung gesetzt wird zu einer auf einige interne Python-Checker basiert bool umgewandelt werden, in der Regel kein Problem, es gibt keinen Unterschied zwischen bool(x) und (x) wenn innerhalb einer if Aussage.

jedoch der Grund bool(x) existiert, ist für Fälle wie:

return bool(x)

die "true oder false", basierend auf dem Objekt zurückkehren würde.

0

Afaik gibt es keinen Unterschied, wenn x entweder '', None, 0 oder False ist, wird es in False konvertiert.

+1

Und '[]' und '{}' und 'set()' und ... die Liste geht weiter. (Jedes Objekt kann mit einer '__nonzero__' Methode (oder' __bool__' für Python 3) definiert werden und dies steuert das Verhalten von 'if x'. – huon

Verwandte Themen