Ja, es gibt einen Unterschied. Sie können den Byte-Code mit dis
dekompilieren, um zu beobachten, was auf der untersten Ebene passiert.
import dis
dis.dis("if i == 0: pass")
1 0 LOAD_NAME 0 (i)
3 LOAD_CONST 0 (0)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 15
12 JUMP_FORWARD 0 (to 15)
>> 15 LOAD_CONST 1 (None)
18 RETURN_VALUE
i
wird 0
auf den konstanten Wert explizit verglichen, wie Sie auf Linie 6 COMPARE_OP
sehen. Inzwischen für den letzteren Fall -
dis.dis("if not i: pass")
1 0 LOAD_NAME 0 (i)
3 POP_JUMP_IF_TRUE 9
6 JUMP_FORWARD 0 (to 9)
>> 9 LOAD_CONST 0 (None)
12 RETURN_VALUE
Sie finden das „Truthiness“ von i
siehe getestet wird. Alles in Python mit einem Falsch-Y-Wert (0
, 0.0
, False
, leere Strings und leere Container) werden alle als False
betrachtet, daher lautet der resultierende Ausdruck True
.
Was Sie verwenden, hängt davon ab, was Sie testen möchten. Möchten Sie die Unwahrheit eines Objekts testen? Oder möchten Sie testen, ob der Wert 0
ist? Letzteres ist viel spezifischer und unterscheidet sich geringfügig von einer semantischen Perspektive.
Ach ja, und wenn wir reden Leistung, dann -
%timeit if i == 0: pass
10000000 loops, best of 3: 51.4 ns per loop
%timeit if not i: pass
10000000 loops, best of 3: 39.1 ns per loop
not i
ist nicht nur pythonic, aber schneller (wenn auch nicht viel, und die Ergebnisse auf verschiedenen Maschinen und Python-Versionen können abweichen).
Dies gilt nicht, wenn 'i' eine Ganzzahl ist, aber wenn' i = [] ', dann ist das Verhalten anders. – chrisz
"wenn nicht" überprüft die "truthy", während '==' versucht, den Wert im Allgemeinen zu vergleichen, wenn Sie nur die Truthy "wenn nicht" oder "wenn ich" schneller ist überprüfen möchten – user1767754
Wenn Sie "i" kennen ist eine ganze Zahl, dann gibt es keinen Unterschied. Verwenden Sie, was immer klarer ist. – khelwood