Python中是否只有一个True和一个False对象?
我知道Python保证只有一个Python中是否只有一个True和一个False对象?,python,object,boolean,instance,Python,Object,Boolean,Instance,我知道Python保证只有一个NoneType实例,即None对象,这样您就可以安全地使用is None来测试某个对象是否等于None 对于boolTrue和False是否有同等的保证(即每种情况只有一个实例) 若否,原因为何 编辑:特别是,我注意到(n+0)是(0+n)为范围(-5257)中的n提供真,反之则提供假。换句话说,零、前256个正整数和前5个负整数似乎是预缓存的,不会再次实例化。我猜这是解释器的选择(在我的例子中是CPython),而不是语言的规范。而bool源于int,所以我仍然
NoneType
实例,即None
对象,这样您就可以安全地使用is None
来测试某个对象是否等于None
对于bool
True
和False
是否有同等的保证(即每种情况只有一个实例)
若否,原因为何
编辑:特别是,我注意到(n+0)是(0+n)
为范围(-5257)
中的n提供真
,反之则提供假
。换句话说,零、前256个正整数和前5个负整数似乎是预缓存的,不会再次实例化。我猜这是解释器的选择(在我的例子中是CPython),而不是语言的规范。而bool
源于int
,所以我仍然想知道我对其他口译员有什么期望
编辑:澄清一下,因为这似乎产生了很多混乱,我的目的不是测试值的布尔解释。因此,我永远不会使用为真
或为假
。我的目的是能够在一个变量中区分False
,该变量可以有多种类型的值,包括空字符串、零和None
,对于True
,也同样如此。我自己是一个经验丰富的程序员,当我看到“if booleanvar==True”时,我会畏缩
关于重复的注意事项:这个问题被认为是(和)的重复,但没有回答这个问题;他们只是声明bool
是int
的一个子类,主要不同于repr
,如果True
和False
保证是唯一的,则不在此限
另外,请注意,这不是关于
True
和False
的名称绑定到什么的问题,而是关于类bool
的实例的问题,bool
类型只有两个实例,True
和False
。此外,它不能被子类化,因此无法创建一个可以有额外实例的派生类
但即使它是有保证的,也很少有好的理由去依赖它。如果x为真,通常应使用,而不是,并避免出现需要将真
与其他真实值或假
与其他虚假值区分开来的情况。来自文档():
布尔人
这些代表了真值False和True。表示值False和True的两个对象是唯一的布尔对象
只有两个对象,任何产生布尔值的计算都将产生这两个现有对象中的一个:
>>> (1 == 1) is True
True
>>> (1 == 0) is False
True
你为什么需要/想要这样做?类似于如果var为真:
与如果var:
相比是丑陋的。一般来说:不要针对真
或假
进行测试。请改用表达式的隐式布尔值。1。这取决于Python的哪个版本;二,。千万不要依赖于此(如果问候语:
,则回答“是:”;如果问候语==True:
,则回答“否:”;如果问候语为True:
,则回答“更糟:”)@PedroGimeno:我强烈建议你不要使用is True
或is False
但是。如果某些东西:
你应该使用,而不是测试True或False。如果你必须使用布尔值,最好使用isinstance(object,bool)
。但是,内置名称True
和False
是单例。但有时您通过执行计算生成实例;例如(917+543)是(916+544)
给出了False
。那么我是否可以保证,如果我给出的是False或True,我就不会有新的实例?从你的回答来看这并不清楚。@PedroGimeno你在比较两个整数,并问它们是否是相同的引用。这与你问题中的布尔无关。不过,如果你在这些整数上调用bool,你会得到你体验到的结果。@PedroGimenot、 布尔(917+543)是布尔(916+544)
True
@JoshSmeaton:我的问题是关于实例的。对于is
,我问它们是否是同一个实例。我使用int
示例是因为bool
是int
的一个子类。请查看我问题的最新编辑。谢谢,这正是我所寻找的答案,得到了一位专家的支持规范性来源。