【问题标题】:Bool as int? How does python evaluate [duplicate]布尔为int? python如何评估[重复]
【发布时间】:2015-08-04 10:41:20
【问题描述】:
In [1]: a=5

In [2]: print(["is odd", "is even"][a % 2 == 0])
is odd

In [3]: [a%2 == 0]
Out[3]: [False]

我的理解是 a % 2 == 0 的计算结果为 TrueFalse

因此,如果它为 True,则等于 1,并且使用列表索引将打印 'is even'

我读过this 并知道boolint 的一个实例。

因此,当在索引中使用时,bool 会评估为它的等效数字,即 01

我的问题

根据直觉,我们可以知道它是int 还是bool

但是 Python 是怎么知道的呢?何时用作bool 以及何时用作int 是否有任何标准?任何来自 Python3 文档的内容都会被欣赏。

【问题讨论】:

  • 你不是在这里评估一个 int 而是一个条件表达式,因此你当然会收到一个 bool
  • 继续运行False.realTrue.real 看看会发生什么
  • @IanAuld False.real=0,True.real=1

标签: python


【解决方案1】:

在 Python 2.x 中,这不能保证,因为 TrueFalse 可能会被重新分配。但是,即使发生这种情况,布尔值 True 和布尔值 False 仍会正确返回以进行比较。

在 Python 3.x 中,True 和 False 是关键字,始终等于 10

在 Python 2 中正常情况下,在 Python 3 中总是这样:

False 对象的类型为bool,它是int 的子类:

 object
   |
  int
   |
  bool

这是在您的示例中 ['zero', 'one'][False] 确实有效的唯一原因。它不适用于不是整数子类的对象,因为列表索引仅适用于整数或定义 __index__ 方法的对象(感谢 mark-dickinson)。

编辑:

当前的 Python 版本和 Python 3 都是如此。Python 2.6 的文档和 Python 3 的文档都说:

整数有两种类型: [...] 整数 (int) [...] 布尔值 (bool) 在布尔小节中:

布尔值:这些代表真值 False 和 True [...] 布尔值在几乎所有上下文中的行为分别类似于值 0 和 1,但在转换为字符串时,字符串“False”除外或 "True" 分别返回。

所以布尔值在 Python 2.6 和 3 中被明确视为整数。

【讨论】:

  • 解释得很清楚
  • 感谢马克-迪金森??
【解决方案2】:

bool 实例 TrueFalseint 实例 01 是分开的。问题是布尔在许多情况下表现得像整数。例如True+True,它是 2。但是,如果我们检查它们是否是同一个对象,我们会发现它不是:True is 1。另一方面,True is True 是真的。这是一个行为类似于整数但打印为 True 和 False 并与 is 进行比较的示例。

class Bool(int):
    def __repr__(self):
        return 'True' if self==1 else 'False'

https://docs.python.org/3/library/stdtypes.html#bltin-boolean-values

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多