变量内存的加深理解

50 阅读2分钟

在Java和Python中,声明变量并初始化(赋值)后,会在栈或堆中给这个变量分配一片相应大小的内存(仅声明不赋值时,多数情况不分配有效内存),变量名本质是给内存地址取的名字,用于找到内存位置并操作其中存储的值。

1. Java 中的具体规则

Java 变量分两类,内存分配位置明确:

  • 基本数据类型(int、float、boolean 等)
    • 声明并赋值后,变量名对应的内存在栈内存中
    • 例如 int a = 10;,栈中直接存储a对应的内存地址, 内存中存10这个值,通过a可直接访问值。
  • 引用数据类型(对象、数组、String 等)
    • 变量名对应的内存在栈内存,其存着堆内存中实际的对象的地址;
    • 对象的具体内容(属性、值)存储在堆内存。例如 User u = new User();,栈中有 u 对应的内存, 内存中是对象在堆内存中的地址,堆中存 User 对象的属性(如 name、age),通过 u 找到堆地址,再访问对象内容。

2. Python 中的具体规则

Python 中“一切皆对象”,内存分配逻辑更简化:

  • 无论何种数据类型(int、list、dict、自定义对象等),变量名(引用变量)对应的内存都在栈内存,而变量对应的对象都存储在堆内存, 变量内存中存的是这个对象在堆内存中的地址
  • 例如 x = 5y = [1,2,3],栈中仅存x, y为名的内存, 内存中是对象在堆内存中的地址,堆中存储5或列表 [1,2,3] 的实际数据,通过变量名找到堆地址即可操作值。
  • 注意:Python 会对小整数(如 -5~256)、短字符串等做“缓存复用”,但本质仍是栈存引用、堆存对象,只是多个变量可能指向堆中同一块缓存内存。