10

我遇到了一些代码,内容如下:

if bool(x):
    doSomething

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

if x:
    doSomething

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

被发现是真的

参考文献中提到了布尔表达式:

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

参考资料中提到了该功能bool()

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

那么以上两者是相同的还是有一些额外的微妙之处?

4

4 回答 4

15

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

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
于 2012-08-09T14:14:16.817 回答
8

if__nonzero__()在可用时使用,就像bool()在测试真值时一样。所以的,行为是等价的。

从文档中:

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

object.__nonzero__(self)

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

于 2012-08-09T14:22:55.053 回答
3

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

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

return bool(x)

这将根据对象返回“true或”。false

于 2012-08-09T14:15:50.247 回答
0

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

于 2012-08-09T14:17:30.200 回答