【问题标题】:Do not understand why if condition evaluates to True when variable is integer不明白为什么当变量为整数时条件评估为真
【发布时间】:2015-03-07 08:17:23
【问题描述】:

我正在使用表现出以下行为的代码。假设我有一个变量 d 并将它分配给一个整数 9

d = 9

为什么以下语句有效?

In [95]: if d:
   ....:     print d
   ....: else:
   ....:     print 'Did not print d!'
   ....:     
9

In [96]: 

当 d 本身不是布尔值且未通过以下测试时:

In [96]: d is True
Out[96]: False

In [97]: d is False
Out[97]: False

如果有人可以向我解释这一点并指出我的任何误解,我将不胜感激。非常感谢。

【问题讨论】:

标签: python variables if-statement int boolean


【解决方案1】:

引用official Python documentation

在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为 false:FalseNone、所有类型的数字零、以及空字符串和容器(包括字符串、元组、列表、字典、集合和frozensets)。 所有其他值都被解释为真。

if 语句属于布尔运算的上下文。由于d9 不属于任何错误值,因此它被认为是真实的。

你可以这样确认

>>> all(bool(value) is False for value in (False, 0, +0, -0, "", (), [], {}, set()))
True

虽然9的值既不是True也不是False,这是你用d is Trued is False测试确定的,但由于上述原因,它被认为是Truthy。

>>> bool(9)
True

【讨论】:

    【解决方案2】:

    请记住,is 测试身份。您的d is Trued is False 语句返回False,因为d9,而不是TrueFalse。但是,d 的真实值是 True - 尝试运行 bool(d) 以获取其布尔值(提示:它将返回 True)。

    如其他地方所述,False、None、0 和空字符串、列表、字典、集合、元组等都被认为是虚假的。对象也可能是虚假的,具体取决于其 __nonzero__ 和/或 __len__ 属性(如果已设置)的内容。

    【讨论】:

      【解决方案3】:

      在您的示例中,整数在 if 语句中被视为 boolean。任何非零整数都将等价于True。这在许多编程语言中很常见。

      【讨论】:

        【解决方案4】:

        根据设计,Python 将大多数值评估为 TRUE。只有非常小的一组被认为是 FALSE。

        当我们执行诸如测试空值或迭代条件循环之类的事情时,这最终成为一个非常好的功能。

        请参阅文档中的第 5.1 节!

        https://docs.python.org/2/library/stdtypes.html

        【讨论】:

        • 它与任何事物的“错误”无关 - 非零整数是真实的。
        • 我删除了成语“to error on the side”。我可以看到它可能会令人困惑。否则,我不知道你为什么不赞成这个答案。
        猜你喜欢
        • 1970-01-01
        • 2014-05-19
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多