【问题标题】:Why is bool(x) where x is any integer equal to True为什么 bool(x) 其中 x 是任何等于 True 的整数
【发布时间】:2013-10-15 20:44:40
【问题描述】:

我预计 bool(1) 使用 Python 等同于 True - 确实如此 - 然后我预计其他整数在转换为 bool 时会出错,但情况似乎并非如此:

>>> x=23 #<-- replace with any integer
>>> bool(x)
True

发生了什么?我误解了bool(x) - 这不会将 x 转换为 Boolean 数据类型吗?


很多 cmets 关于为什么我觉得这违反直觉。如果我像下面这样写上面的内容,乍一看没有语言知识,这似乎违反直觉:

>>>True == bool(23)
True

【问题讨论】:

  • bool(-1)True。如果您在谈论整数,则只有 bool(0)False
  • 你也可以在这里查看更多信息:docs.python.org/3/library/functions.html#bool
  • 您为什么希望其他整数值不能转换为布尔值?
  • 您不应该假设True 具有任何特定的非零值;这是一个实现细节,它有任何整数值,更不用说具体的 1。
  • 如果您知道bool(23)True,为什么不期待True == bool(23)

标签: python


【解决方案1】:

bool 本身的目的不是将值转换为 bool 数据类型。相反,它返回值是否为真,即它的行为方式与此函数相同:

def bool_mimic(val):
    if val:
        return True
    else:
        return False

来自the docs

布尔([x])

使用标准真值测试程序将值转换为布尔值 [参见Rohit 的答案]。如果 x 为 false 或省略,则返回 False;否则返回Truebool 也是一个类,它是int 的子类。类 bool 不能进一步细分。它的唯一实例是FalseTrue

在整数的情况下,唯一的非真实整数是0

【讨论】:

  • @Nirk:不,但它是相关的,并且用方括号标记不在原始引用中的文本是一种常见的约定。如果那是你的话,似乎几乎不值得一票。
  • 回想起来,可能没有必要投反对票。未投票
  • +1 所以更像是对存在的测试:虽然 0 存在。这不存在 = ()
  • @whytheq:嗯。覆盖此行为的方法应该会给您一个提示 - 它称为__nonzero__。那么按照惯例将空元组、列表和字典定义为“零”,将其中包含元素的元素定义为“非零”。实际上它使代码看起来很漂亮,IMO,但我也很习惯它,所以我可能会有偏见。
【解决方案2】:

正如其他张贴者所提到的,它对任何非零整数都是真实的。

它有点类似于python中的其他东西,就像这里提到的:

Python 'If not' syntax

(Rohit 引用了一段关于真值测试的好话)

【讨论】:

    【解决方案3】:

    来自5.1 Truth Value Testing

    以下值被认为是错误的:

    • None
    • False
    • 任何数字类型的零,例如,00L0.00j
    • 任何空序列,例如''()[]
    • 任何空映射,例如{}
    • 用户定义类的实例,如果该类定义了__nonzero__()__len__()方法,当该方法返回整数zeroboolFalse

    所有其他值都被认为是true——因此许多类型的对象都是 永远正确。

    【讨论】:

    • +1 好的 - 我喜欢这个。乍一看,这似乎很疯狂……整数中只有 0 是假的,其他的都是真。现在我看到了答案,虽然看起来没问题 - 为什么只有 0==False、1==True 和所有其他都是某种错误:这只是语言设计者做出的决定。
    • @whytheq 我不会说这是特定于语言的东西。在编程世界中,将0 表示为falsy,将其他所有内容表示为truthy 是很常见的。事情变得容易处理。但是,对于相反的情况,True 始终转换为 1False 始终转换为 0。然而,有些语言没有这种从数值到布尔值的映射,例如Java
    • @RohitJain 虽然有些语言不遵循这一点。在 Ruby 中,0 不是虚假的。只有falsenil 被视为false
    • @Cezar 是的,这就是我在上一行中所说的。 Java 也是如此。没有从数值到布尔值的映射。
    【解决方案4】:

    bool(x) 使用标准真值测试程序将其参数转换为Bool。例如,在 if 测试中返回 true 的任何内容在作为参数传递给 bool 时都将返回 True

    检查 Truth Value Testing 以查看在 Python 中哪些值被视为 TrueFalse

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 2023-03-19
      • 2021-09-21
      • 2013-11-13
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      相关资源
      最近更新 更多