为何Python中False(0)占用字节数小于True(1)?
为什么Python中False/0的sys.getsizeof()结果比True/1小?
这个问题戳中了Python内部优化的一个小细节,咱们结合你的测试代码和底层逻辑来解释:
首先先还原你的测试代码和输出:
测试代码:
import sys print("Zero: " + str(sys.getsizeof(0))) print("One: " + str(sys.getsizeof(1))) print("False: " + str(sys.getsizeof(False))) print("True: " + str(sys.getsizeof(True)))
输出结果:
Zero: 24
One: 28
False: 24
True: 28
你提到的其他小整数测试:
for n in range(0, 12): print(str(n) + ": " + str(sys.getsizeof(n)))
运行后会发现,只有0的占用是24字节,1到11全是28字节。
核心原因:布尔值的本质 + 小整数缓存的内部优化
布尔值是整数的子类
Python里的bool类型继承自int,False其实就是0的布尔实例,True就是1的布尔实例。你可以用isinstance(False, int)验证,返回的是True,所以它们的内存占用会和对应的整数完全一致。小整数缓存的特殊处理
Python为了提升性能,会预先缓存-5到256之间的整数对象——这些常用整数不会被重复创建,而是复用同一个实例。但在这个缓存池里,0是个特殊存在:- 底层的整数对象(
PyLongObject)结构中,0不需要额外的引用标记或者扩展存储字段,它的内部结构是最精简的版本,所以占用24字节。 - 而
1及其他缓存的小整数,因为在Python的内部逻辑中会被更频繁地用作计数、状态标记等,它们的对象结构多了一些用于引用计数或优化的附加字段,导致内存占用增加到28字节。
- 底层的整数对象(
额外补充
当你测试大于256的整数时(比如257),会发现它们的内存占用也是28字节(或更高,取决于Python版本),这是因为这些是新创建的整数对象,不再复用缓存实例,但它们的结构和1~256的缓存整数是一致的,只有0是那个被特殊精简的例外。
内容的提问来源于stack exchange,提问作者Bram Vanroy
相关产品推荐
相关产品推荐

