Python3中str与bytes对象的内存存储是否一致?
Python3中str与bytes的内存存储问题解答
核心结论先明确
Python3里str和bytes是完全独立的对象类型,内存存储结构差异极大;sys.getsizeof()返回的是整个Python对象的总内存占用,而非仅有效数据部分,这是你产生困惑的核心原因。
1. '\x0d'与b'\x0d'的存储差异
首先纠正一个小错误:ASCII值13对应的二进制是00001101,不是你写的00000111(那是ASCII值7)。
- 对于
b'\x0d':它的有效数据部分确实是单个字节00001101,但CPython的bytes对象除了存储原始字节,还包含对象头信息(引用计数、类型指针、长度标记等)。在Python 3.9中,空bytes对象b''的sys.getsizeof()是33字节,加上1个有效字节后总占用就是33+1=34字节,和你的测试结果完全匹配。 - 对于
'\x0d':它存储的是Unicode码点U+000D(回车符),str对象的头结构比bytes更复杂,空str对象''的sys.getsizeof()是49字节,加上1个单字节码点后总占用就是49+1=50字节,也和你的测试一致。
二者的有效数据二进制内容是相同的,但整个对象的内存结构、总占用内存完全不同。
2. 你的两个具体疑问解答
- Python3中str和bytes是否以不同对象形式存储?
是,二者属于不同的类(strvsbytes),内存中的对象头、存储逻辑都不一样,是完全独立的两种对象。 - 当我们说
b'\x0d'以00001101形式存储时是基于抽象层面吗?实际在CPython3中它占用34字节内存?
没错,说b'\x0d'以00001101存储,指的是它的有效业务数据部分,这是抽象层面的逻辑描述;而sys.getsizeof()返回的是整个Python对象的内存开销,包括对象管理所需的元数据,所以实际CPython中这个对象确实占用34字节——33字节是对象头开销,1字节是有效数据。
内容的提问来源于stack exchange,提问作者showkey
相关产品推荐
相关产品推荐

