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

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是否以不同对象形式存储?
    是,二者属于不同的类(str vs bytes),内存中的对象头、存储逻辑都不一样,是完全独立的两种对象。
  • 当我们说b'\x0d'以00001101形式存储时是基于抽象层面吗?实际在CPython3中它占用34字节内存?
    没错,说b'\x0d'以00001101存储,指的是它的有效业务数据部分,这是抽象层面的逻辑描述;而sys.getsizeof()返回的是整个Python对象的内存开销,包括对象管理所需的元数据,所以实际CPython中这个对象确实占用34字节——33字节是对象头开销,1字节是有效数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:07:25