if 语句和 if equals 语句的区别

Difference between an if statement and an if equals statement

两者有实际区别吗
if statement:

if statement == True:

除了第一个更短之外,哪个优先级更高,还是更慢?

编辑:

我意识到这可能不是很清楚,但 statement 通常是 statement = True

if statement:只要 statementtruthyint 不等于 '0',True,一个 list 至少有一个元素,一个 dict 有一个键,值对..等)。

if statement == True:仅当 statementTrue 时才计算为真,即

>>> print(statement)
True

那些不等于。 Python 允许您 在大范围的元素 上定义 if 语句。例如你可以写:

if []: # is False
    pass
if 1425: # is True
    pass
if None: # is False
    pass

基本上,如果您编写 if <expr>,Python 将 计算表达式 truthness。这是为数字预定义的(intfloatcomplex、不等于零)、一些内置集合(listdict、不为空),并且您可以自己在任意对象上定义 __bool____len__。您可以通过对对象调用 bool(..) 来获得对象的 真实性 。例如 bool([]) == False.

if x 不等于 if x == True 的示例:

例如:

if 0.1:
    pass # will take this branch
else:
    pass

将采用 if 分支,而:

if 0.1 == True:
    pass
else:
    pass # will take this branch

不走if分支。这是因为一个数字 等于 True 如果它是一个 (1, 1L, 1+0j,...) .而如果 x 非零 .

,则数字的 bool(x)True

也可以定义一个对象,其中 == 引发异常 。喜欢:

class Foo:

    def __eq__(self,other):
        raise Exception()

现在调用 Foo() == True 将导致:

>>> Foo() == True
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __eq__
Exception

但是 不建议__eq__ 函数中引发异常(无论如何我强烈建议不要这样做)。

然而,它认为:if <expr>: 等同于 if bool(<expr>):

鉴于两者相等,显然 <expr> == True 会变慢,因为您额外调用了 __eq__,等等

此外,通常更惯用来检查集合是否为空:

some_list = []

if some_list: # check if the list is empty
    pass

这也更 安全 因为如果 some_list 可能是 None (或另一种集合),您仍然检查它是否成立至少有一个元素,所以稍微改变一下想法不会产生太大的影响。

所以如果你必须写if x == True,通常会有一些奇怪的与[=39的真实性 =]本身。

关于真相的一些背景

如文档中所述 (Python-2.x/Python-3.x)。有办法解决真实性。

中,它被评估为(过度简化版本,更多"pseudo Python"代码来解释它是如何工作的):

# Oversimplified (and strictly speaking wrong) to demonstrate bool(..)
# Only to show what happens "behind the curtains"
def bool(x):
    if x is False or x is None:
        return False
    if x == 0 or x == 0.0 or x == 0L or x == 0j:
        return False
    if x is () or x == [] or x == '' or x == {}:
        return False
    if hasattr(x,'__nonzero__'):
        y = x.__nonzero__()
        return y != 0 and y != False
    if hasattr(x,'__len__'):
        return x.__len__() != 0
    return True

过度简化的版本

# Oversimplified (and strictly speaking wrong) to demonstrate bool(..)
# Only to show what happens "behind the curtains"
def bool(x):
    if x is False or x is None:
        return False
    if x == 0 or x == 0.0 or x == 0j:
        return False
    if x is () or x == [] or x == '' or x == {}:
        return False
    if hasattr(x,'__bool__'):
        return x.__bool__() is True
    if hasattr(x,'__len__'):
        return x.__len__() != 0
    return True