布尔作为int? python是如何评估的

时间:2015-05-22 12:00:32

标签: python

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文档的任何东西都会被附加。

2 个答案:

答案 0 :(得分:6)

在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,例外情况是当转换为字符串时,字符串&#34 ;假"或" True"分别归还。

因此,在Python 2.6和3中,布尔值被明确地视为整数。

答案 1 :(得分:0)

bool个实例TrueFalseint个实例01分开。事实是,在许多情况下,bools的行为就像整数一样。例如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