if语句和if equals语句之间的区别

时间:2017-03-17 22:14:58

标签: python python-3.x if-statement truthiness

之间是否存在实际差异?
if statement:

if statement == True:

除了第一个更短,一个人有更高的优先权,还是一个更慢?

编辑:

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

2 个答案:

答案 0 :(得分:7)

不等于。 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如果是11L1+0j,...)。如果bool(x) <{1}} 非零,则Truex

还可以定义==引发异常的对象。像:

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,那么x本身的真实性通常会有怪异的

关于真实性的一些背景

正如文档(Python-2.x / Python-3.x)中所指定的那样。有办法解决真相。

中,它会被评估为(过度简化版本,更多“伪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

答案 1 :(得分:2)

if statement:只要statement 真实int不等于'0',True,a,评估结果为真list至少有一个元素,dict只有一个键,值对..等等。

if statement == True:如果statementTrue,则仅评估为真,即

>>> print(statement)
True