我知道Python保证NoneType
只有一个实例,即None
对象,因此您可以安全地使用is None
来测试是否有东西等于None
。
对于bool
、True
和False
是否有一个等价的保证(即每个只有一个实例)?
如果没有,为什么没有?
EDIT:特别是,我注意到(n+0) is (0+n)
在range(-5, 257)
和False
中为n给出True
。换句话说,0,前256个正整数和前5个负整数似乎是预缓存的,并且不会再次实例化。我猜这是解释器的选择(在我的情况下是CPython),而不是语言的规范。bool
源于int
,所以我仍然想知道我对其他解释器有什么期望。
EDIT:澄清一下,因为这似乎产生了很多混乱,我的意图是而不是来测试值的布尔解释。因此,我永远不会使用is True
或is False
。我的目的是能够区分False
和其他所有东西,在一个变量中,可以有几种类型的值,包括空字符串、零和None
, True
也是如此。我自己就是一个经验丰富的程序员,当我看到"if boolean == True"时,我就会畏缩。
关于重复的注释:这个问题被指控是(this和this)的重复,不回答这个问题;他们只是声明bool
是int
的子类,主要区别在于repr
,而不是保证True
和False
是唯一的。
True
和False
绑定到什么的问题,而是关于类bool
的实例。
From docs (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
bool
类型只有两个实例,True
和False
。而且,它不能被子类化,所以没有办法创建一个可以有额外实例的派生类。
但是,即使它是有保证的,也很少有好的理由依赖它。您通常应该使用if x
而不是if x is True
,并避免需要将True
与其他真值或False
与其他假值区分开来的情况。