之间是否存在实际差异?
if statement:
和
if statement == True:
除了第一个更短,一个人有更高的优先权,还是一个更慢?
编辑:
我意识到这可能不太清楚,但statement
通常是statement = True
。
答案 0 :(得分:7)
不等于。 Python允许您在大量元素上定义if
语句。你可以写一下:
if []: # is False
pass
if 1425: # is True
pass
if None: # is False
pass
基本上,如果您编写if <expr>
,Python将评估表达式的truthness 。这是针对数字预定义的(int
,float
,complex
,不等于零),一些内置集合(list
,dict
,不为空),您可以自己在任意对象上定义__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
,...)。如果bool(x)
<{1}} 非零,则True
为x
。
还可以定义==
将引发异常的对象。像:
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-2.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
以及python-3.x的过度简化版本:
# 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
:如果statement
为True
,则仅评估为真,即
>>> print(statement)
True