赋值True/False的变量是否引用内存中地址固定的布尔对象?
布尔变量是否引用内存中固定地址的True/False常量对象?
背景
我在研究==和is的区别时,了解到==用于比较对象的值,is用于检查两个对象是否为同一实例(即是否占用同一内存地址)。随后测试了这段代码:
foo = False if foo is False: print("1")
原本以为会报错(认为False是值,is无法处理),但代码运行通过了,因此产生疑问:所有布尔变量是否都持续引用内存中地址固定的True和False这两个对象?
回答
你的猜测完全正确。在Python里,True和False是单例对象——内存里只会存在这两个布尔实例,它们的地址是固定不变的。
不管你是直接写variable = True赋值,还是通过逻辑运算(比如variable = 2 == 2)得到布尔结果,最终变量都会指向这两个固定的实例。这也是你测试的代码能正常运行的原因:False本身就是一个对象实例,is关键字就是用来判断两个变量是否指向同一个内存地址的实例,所以foo is False是完全合法的写法。
另外补充个小知识点:Python对这类常用的小对象都会做单例优化,比如-5到256之间的整数,也都是固定内存地址的单例,这么做是为了减少重复创建相同对象的内存开销。
内容的提问来源于stack exchange,提问作者Magikarp
相关产品推荐
相关产品推荐

