在Python中`if bool(x)`和`if x`之间有什么区别吗?

时间:2012-08-09 14:12:28

标签: python

我遇到了一些代码:

if bool(x):
    doSomething

我认为以下内容可以完成相同的工作:

if x:
    doSomething

The reference表示如果测试表达式

,它会评估套件
  发现

是真的

引用说明了布尔表达式:

  

在布尔运算的上下文中,以及控制时使用表达式时,使用流语句   通过控制流语句,以下值被解释为   false:False,None,所有类型的数字零,以及空字符串和   containers ...所有其他值都被解释为true。

referencebool()函数:

  

使用标准真值测试程序

将值转换为布尔值

上述两个相同还是有一些额外的微妙之处?

4 个答案:

答案 0 :(得分:14)

当对象放在if语句中时,会隐式转换为bool类型。因此,对于大多数用途,x语句中的bool(x)if之间没有区别。但是,如果因为正在进行函数调用而调用bool(),则会产生额外的开销。这是一个快速测试来证明这一点:

In [7]: %timeit if(''): pass
10000000 loops, best of 3: 21.5 ns per loop

In [8]: %timeit if(bool('')): pass
1000000 loops, best of 3: 235 ns per loop

答案 1 :(得分:7)

if将使用__nonzero__()(如果可用),bool()在测试真值时也是如此。所以,行为是等效的。

来自文档:

  

在布尔运算的上下文中,以及表达式时   在控制流语句中使用时,将解释以下值   as false:False,None,所有类型的数字零和空字符串   和容器(包括字符串,元组,列表,字典,集合   和frozensets)。所有其他值都被解释为true。 (见    __nonzero__() 更改此方法的特殊方法。)

object.__nonzero__(self)

  

调用实现真值测试,内置操作bool();应返回False或True,或者它们的整数等于0或   1.如果未定义此方法,则调用__len__()(如果已定义),如果对象的结果非零,则认为该对象为true。   如果一个类既不定义__len__()也不定义__nonzero__(),那么它就是全部   实例被认为是真实的。

答案 2 :(得分:3)

您在if语句中放置的任何对象都将基于某个内部python检查器转换为bool,通常不是问题,bool(x)(x)之间没有区别在if语句中时。

但是,bool(x)存在的原因是针对以下情况:

return bool(x)

根据对象返回“truefalse”。

答案 3 :(得分:0)

Afaik没有区别,如果x是'',None,0或False,它将被转换为False。