You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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字节。

核心原因:布尔值的本质 + 小整数缓存的内部优化

  1. 布尔值是整数的子类
    Python里的bool类型继承自int,False其实就是0的布尔实例,True就是1的布尔实例。你可以用isinstance(False, int)验证,返回的是True,所以它们的内存占用会和对应的整数完全一致。

  2. 小整数缓存的特殊处理
    Python为了提升性能,会预先缓存-5到256之间的整数对象——这些常用整数不会被重复创建,而是复用同一个实例。但在这个缓存池里,0是个特殊存在:

    • 底层的整数对象(PyLongObject)结构中,0不需要额外的引用标记或者扩展存储字段,它的内部结构是最精简的版本,所以占用24字节。
    • 而1及其他缓存的小整数,因为在Python的内部逻辑中会被更频繁地用作计数、状态标记等,它们的对象结构多了一些用于引用计数或优化的附加字段,导致内存占用增加到28字节。

额外补充

当你测试大于256的整数时(比如257),会发现它们的内存占用也是28字节(或更高,取决于Python版本),这是因为这些是新创建的整数对象,不再复用缓存实例,但它们的结构和1~256的缓存整数是一致的,只有0是那个被特殊精简的例外。

内容的提问来源于stack exchange,提问作者Bram Vanroy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:08:04