Python中只有一个True对象和一个False对象吗?

时间:2014-07-19 17:05:04

标签: python object boolean instance

我知道Python保证只有NoneTypeNone对象的实例,因此您可以安全地使用is None来测试某些内容是否等于None

bool TrueFalse是否有相同的保证(即每个只有一个实例)?

如果没有,为什么不呢?

编辑:特别是,我注意到(n+0) is (0+n)True中的n和range(-5, 257)提供了False。换句话说,零,前256个正整数和前5个负整数似乎是预先缓存的,并且不会再次实例化。我猜这是解释器的选择(在我的例子中是CPython)而不是语言的规范。而bool来自int,所以我仍然不得不怀疑我对其他口译员的期望。

编辑:为了澄清,因为这似乎产生了很多混乱,我的意图是来测试值的布尔解释。为此,我永远不会使用is Trueis False。我的目的是能够将False与其他所有内容区分开来,在一个变量中可以包含多种类型的值,包括空字符串,零和None,以及类似于True的变量。我自己是一位经验丰富的程序员,当我看到"如果booleanvar == True"那时就会畏缩。

关于复制品的说明:据称这一问题与(thisthis)重复的问题没有回答这个问题;他们只是声明boolint的子类,主要区别于repr,而不是TrueFalse保证唯一。

另请注意,这不是关于名称 TrueFalse绑定的问题,而是实例 of class bool

2 个答案:

答案 0 :(得分:6)

来自文档(https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy):

  

布尔

     

这些代表真值False和True。表示值False和True的两个对象是唯一的布尔对象。

只有两个对象,任何产生布尔值的计算都会产生这两个现有对象中的一个:

>>> (1 == 1) is True
True
>>> (1 == 0) is False
True

答案 1 :(得分:1)

bool类型只有两个实例,TrueFalse。此外,它不能被子类化,因此无法创建可以有其他实例的派生类。

但即使它得到保证,也很少有理由依赖它。您通常应该使用if x而非if x is True,并避免需要将True与其他真实值或False与其他虚假值区分开来的情况。