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

Python中大于1字节对象的内存地址计算与引用规则问题

Python内存地址相关问题解答

首先纠正核心认知偏差:
你对「单个内存地址对应1字节内存空间」的理解是准确的,但「8字节对象用地址*8计算位置」的猜想不符合实际运行环境的寻址规则。

  • 所有运行Python的通用操作系统、CPU都采用字节寻址模式:内存地址的每个编号,唯一对应1字节的虚拟内存单元。
  • 占用N字节的对象,它公开的内存地址就是这块连续N字节内存的首字节地址,后续字节通过「首地址+偏移量」直接访问,不存在任何乘系数的换算。你猜想的“地址乘8”逻辑仅存在于组成原理教材的字寻址模型中,现实用户态开发场景不会用到。

对应你写的测试代码:

import sys
a = 1
sys.getsizeof(a)  # 返回值28代表这个整数对象总占用28字节内存
id(a)             # 返回值就是这28字节连续内存的首字节地址编号

也就是说这个值为1的整数对象,完整占用了从id(a)到id(a)+27共28个地址对应的字节空间,不存在“一个地址对应多字节、要换算内存槽”的情况。你产生这个疑惑本质是把「64位系统中指针大小为8字节」和「内存寻址单位」的概念搞混了——哪怕是8字节长的指针变量,本身也是占从自身首地址开始连续8个1字节的地址单元,没有任何特殊寻址逻辑。


再解释空列表执行append后内存地址不变的原因:
你已经了解列表存储的是指向元素的指针,而CPython的list本质是带预分配机制的动态数组:

  • 即便是空列表,初始化时也会提前申请一块连续内存作为预留存储空间,用来存放后续新增元素的指针,并非空列表就占用0字节。
  • 执行append操作时,只要当前已存储的元素数量没有超过预分配的容量上限,就会直接把新元素的指针写入预留的内存位置,列表这个容器本身的结构体首地址(也就是id(列表)返回的值)自然不会发生变化。
  • 只有当append的元素数量超过预分配容量、触发扩容逻辑时,列表才会申请一块更大的新连续内存块,把原有存储的所有元素指针拷贝到新块中,这时候列表的内存地址才会改变。

补充易混淆点:列表id不变仅代表列表容器本身的内存位置没变,列表里指针指向的实际元素本来就存储在独立的内存位置,和列表本身的地址没有连续存储的绑定关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:39:35