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

Joe*_*Joe 9 python

我遇到过一些代码:

if bool(x):
    doSomething
Run Code Online (Sandbox Code Playgroud)

我认为以下会做同样的工作:

if x:
    doSomething
Run Code Online (Sandbox Code Playgroud)

参考文献说,如果测试表达式,它会评估套件

被发现是真的

参考文献说布尔表达式:

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

参考了的说bool()功能:

使用标准真值测试程序将值转换为布尔值

那么上面两个相同还是有一些额外的微妙之处呢?

Lan*_*aru 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
Run Code Online (Sandbox Code Playgroud)

  • @InbarRose:不,那只是'timeit`循环的次数.它决定在第二种情况下做得更少,因为它慢了10倍.`per loop`是重要的数字. (6认同)
  • 你的代码有不匹配的循环检查器....一个是10,000,000,另一个是1,000,000 (2认同)

pha*_*t0m 7

if__nonzero__()如果可用,将使用,就像bool()测试真值的值一样.所以是的,行为是等同的.

从文档:

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

object.__nonzero__(self)

被调用来实现真值测试,内置操作bool();应该返回False或True,或者它们的整数等价于0或1.如果没有定义此方法,__len__()则调用它,如果已定义,则对象被认为是真的,如果它的结果非零.如果一个类既未定义也 __len__()未定义__nonzero__(),则其所有实例都被视为真.

  • `__nonzero__`在python 3.x中被称为`__bool__`. (2认同)