检查整数是否等于 0 或不为 False 有区别吗

Is there a difference in checking if an integer is equal to 0 or not False

因此,据我所知,有两种不同的方法可以检查整数是否为 Python 中的 0。我们可以这样做:

if i == 0:
    ...

if not i:
    ...

第一个可以说更清晰,但是否存在它们产生不同结果或一个表现更好的情况?

Speedwise 几乎没有区别,但是 == 在我的系统上 ~3% 表现更好 1000 运行 在 10**7 比较循环中.此外,这是您不应该很难想到的优化,尤其是使用 python.

执行 if not iif i 之类的查询是在检查给定值的真实性。其中数字 0 的计算结果为 false,小于或大于 true 的任何值。 同样,在实际决定选择哪一个之前,您应该问自己一个问题,您是在寻找具有特定值的 truthy 还是 comparision

if i == 0

仅当 i 等于 0iFalse 时才为真,而

if not i
i 为 0 时,iFalse 时,

为真,当 i 为空集合时,

也为真。

根据您的尝试,一个可能比另一个更好。

使用后一种解决方案可能会有 非常 的轻微性能优势,但这可以忽略不计。代码的清晰度和正确性更为重要。

是的,有区别。您可以使用 dis 反编译字节码以观察最低级别发生的情况。

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 与常量值 0 明确比较,如您在行 6 COMPARE_OP 中所见。同时,对于后一种情况 -

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

您会看到 i 的 "truthiness" 已经过测试。 python 中任何具有假 y 值(00.0False、空字符串和空容器)都被认为是 False,所以结果表达式是 True

你用什么取决于你想测试什么。你想测试一个对象的虚假性吗?还是要测试值是否为0?后者更具体,从语义角度来看略有不同。

哦,如果我们在谈论性​​能,那么 -

%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 不仅是 pythonic,而且速度更快(虽然不是很多,并且结果可能因不同的机器和 python 版本而异)。