【问题标题】:Is there any difference between `if bool(x)` and `if x` in Python?Python中的`if bool(x)`和`if x`有什么区别吗?
【发布时间】:2012-08-09 14:12:27
【问题描述】:

我遇到了一些代码:

if bool(x):
    doSomething

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

if x:
    doSomething

The reference 表示如果测试表达式,它会评估套件

发现是真的

参考说布尔表达式:

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

reference 表示 bool() 函数:

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

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

【问题讨论】:

  • 只需点击文档中关于 if 的第一个链接,您就会得到答案。
  • 我知道参考资料是怎么说的。这就是我引用它的原因。正如参考资料所说,它不是一个规范,我在问我对文档的阅读是否正确。
  • 不,它会将您链接到 _ nonzero() _
  • 谢谢。这不是文档中关于 if 的第一个链接,但确实包含小瓶语句。
  • 如果要引用“调用实现真值检测和内置操作bool();”作为答案,我会勾选它。其他答案没有提到这个。

标签: python


【解决方案1】:

将对象放在 if 语句中时,它们会隐式转换为 bool 类型。因此,在大多数情况下,xbool(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

【讨论】:

  • 你的代码有不匹配的循环检查器......一个是 10,000,000,另一个是 1,000,000
  • @InbarRose:不,这只是timeit 循环的次数。它决定在第二种情况下做更少的事情,因为它慢了 10 倍。 per loop 是重要的数字。
  • %timeit 函数重复代码的次数取决于代码的速度。
【解决方案2】:

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

来自文档:

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

object.__nonzero__(self)

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

【讨论】:

  • 这不是第一个答案,但它确实包含ifbool() 函数之间的分类链接,因此标记为正确。
  • __nonzero__ 在 python 3.x 中被称为__bool__
【解决方案3】:

您放入if 语句中的任何对象都将根据一些内部python 检查器转换为布尔值,通常不是问题,bool(x)(x)if 中没有区别声明。

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

return bool(x)

这将根据对象返回“truefalse”。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 还有[]{}set() 和......这个列表还在继续。 (任何对象都可以用__nonzero__ 方法(或__bool__ 用于Python 3)定义,这控制if x 的行为。)
    猜你喜欢
    • 1970-01-01
    • 2016-04-22
    • 2020-02-28
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多