在Python中,内置常量None保证是单数的。它只有一个实例。
其他内置类型则不是这种情况。具有相同内容的字符串或数字不是唯一的。两个字符串"a"和"a"不是唯一的,但具有不同的实例。具有相同内部值的两个数字也是如此,例如 1.0 和 1.0。
内置的布尔常量 True 和 False 是否像 None 一样唯一,或者它们有不同的实例?
一个具体的例子是:
value = 1 == 1
在这种情况下,value
与True
相同的实例吗?
常量True
和False
是唯一的,因为规范保证它们是bool
的唯一实例。 也就是说,如果您有两个变量都使用True
或真正的布尔表达式(如1 == 1
,* )初始化,那么它们将与is
相同。False
也是如此。
但是,True == 1 and True is not 1
. 这是因为布尔值是int
的一个子类。 布尔值永远不会与具有is
的"常规"整数进行比较,但在与整数、浮点值和其他数值类型进行比较时,将忽略类型差异,这是数值层次结构的标准行为。
* 小心使用更精细的布尔表达式。 特别是,and
和or
总是返回它们的一个操作数,并且不强制使用布尔值(除非它们的操作数已经是布尔值)。
(顺便说一下,Python 除了True
、False
和None
之外,还包含另外两个单例,即Ellipsis
和NotImplemented
。 每个类型对象也或多或少是唯一的;如果你写x = int; y = int
,那么x
和y
将比较与is
相同,因为只有一个对象表示int
类型。 如果要创建自己的类型层次结构,并且希望避免对象像布尔值与整数一样与其子类进行比较,则可以使用此方法。 在其他情况下,与isinstance()
或issubclass()
相比,它具有边际收益,后者更好地尊重了Liskov替代原则。