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